溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中賦值、淺拷貝、深拷貝三者的區別

發布時間:2021-05-04 17:05:37 來源:億速云 閱讀:141 作者:Leah 欄目:開發技術

本篇文章為大家展示了Python中賦值、淺拷貝、深拷貝三者的區別,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

python有哪些常用庫

python常用的庫:1.requesuts;2.scrapy;3.pillow;4.twisted;5.numpy;6.matplotlib;7.pygama;8.ipyhton等。

一、賦值

不會開辟新的內存空間,只是復制了新對象的引用。所以當一個數據發生變化時,另外一個數據也會隨之改變。

二、 淺拷貝

創建新對象,其內容是對原對象的引用。淺拷貝之所以稱為淺拷貝,是因為它僅僅只拷貝了第一層,即只拷貝了最外層的對象本身,內部的元素都只是拷貝了一個引用而已,即內部元素如果被修改,則另外一個數據也會發生變化。

淺拷貝的三種形式:

A = [1, 2, 3, 4]
  • 切片操作

# 第1種
B = A[:]
# 第2種
B = [a for a in A]
  • 工廠函數

B = list(A)
  • copy函數

B = copy.copy(A)

淺拷貝要分兩種情況進行討論:

1)當淺拷貝的值是不可變對象(例如字符串、元組、數值類型)時,和賦值情況一樣,對象的內存地址(id())與淺拷貝原來的值一致。

2)當淺拷貝的值是可變對象(例如列表、字典、集合等)時,也需要分兩種情況討論:

首先,原來值的內存地址與拷貝后的內存地址不同。

  • 當要拷貝的對象里面,沒有可變的子對象時,原來值(拷貝值)的改變并不會影響拷貝值(原來值)。

  • 當要拷貝的對象里面,有可以改變的子對象時,改變該子對象,原來值和拷貝值之間會互相影響。

三、深拷貝

深拷貝拷貝出來的對象是一個全新的對象,和原來的對象沒有任何的關聯。改變原有對象不會影響新的拷貝對象。

四、例子

  • 不可變對象

import copy
# 不可變對象
# A = (1, 2, 'hello')   # 元組
# A = 1                 # 數值
A = 'hello'             # 字符串

print("********賦值********")
B = A
print(id(A))
print(id(B))
print(A)
print(B)

print("********淺拷貝********")
B = copy.copy(A)
print(id(A))
print(id(B))
print(A)
print(B)

print("********深拷貝********")
B = copy.deepcopy(A)
print(id(A))
print(id(B))
print(A)
print(B)

結果:

********賦值********
1894005658264
1894005658264
hello
hello
********淺拷貝********
1894005658264
1894005658264
hello
hello
********深拷貝********
1894005658264
1894005658264
hello
hello

  • 可變對象

import copy
# 可變對象
A = [1, 2, 3]

print("********賦值********")
B = A
print(id(A))
print(id(B))
print(A)
print(B)

print("********淺拷貝********")
B = copy.copy(A)
print(id(A))
print(id(B))
print(A)
print(B)

print("********深拷貝********")
B = copy.deepcopy(A)
print(id(A))
print(id(B))
print(A)
print(B)

結果:

********賦值********
1602694308360
1602694308360
[1, 2, 3]
[1, 2, 3]
********淺拷貝********
1602694308360
1602694308424
[1, 2, 3]
[1, 2, 3]
********深拷貝********
1602694308360
1602950316296
[1, 2, 3]
[1, 2, 3]

  • 可變對象修改外層

import copy
# 可變對象
A = [1, 2, 3, [11, 10, 20]]

# 可變對象的外層修改
B1 = A                   # 賦值
B2 = copy.copy(A)        # 淺拷貝
B3 = copy.deepcopy(A)    # 深拷貝
A.append(4)
print("********賦值********")

print(id(A))
print(id(B1))
print(A)
print(B1)

print("********淺拷貝********")
print(id(A))
print(id(B2))
print(A)
print(B2)

print("********深拷貝********")
print(id(A))
print(id(B3))
print(A)
print(B3)

結果:

********賦值********
2215309238856
2215309238856
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20], 4]
********淺拷貝********
2215309238856
2215593496776
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]
********深拷貝********
2215309238856
2215593518024
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]

  • 可變對象修改內層

import copy
# 可變對象
A = [1, 2, 3, [11, 10, 20]]

# 可變對象的內層修改
B1 = A                   # 賦值
B2 = copy.copy(A)        # 淺拷貝
B3 = copy.deepcopy(A)    # 深拷貝
A[3].append(4)
print("********賦值********")

print(id(A))
print(id(B1))
print(A)
print(B1)

print("********淺拷貝********")
print(id(A))
print(id(B2))
print(A)
print(B2)

print("********深拷貝********")
print(id(A))
print(id(B3))
print(A)
print(B3)

結果

********賦值********
2288591069768
2288591069768
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********淺拷貝********
2288591069768
2288847138760
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********深拷貝********
2288591069768
2288847168264
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20]]

上述內容就是Python中賦值、淺拷貝、深拷貝三者的區別,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女