參考文章
在python中,物件的賦值就是簡單的物件引用,這點和c++不同。如下:
a =[1
,2,3
,"hello",[
"python"
,"c++"]]
b = a
for i in
range
(len
(a))
:print(id
(a[i])==
id(b[i]))
# all true
print
(a == b)
# true
這種情況下,b和a是一樣的,他們指向同一片記憶體,b不過是a的別名,是引用。我們可以使用a與b是否相同來判斷,返回true,表明他們位址相同,內容相同。
賦值操作(包括物件作為引數、返回值)不會開闢新的記憶體空間,它只是複製了新物件的引用。也就是說,除了b這個名字以外,沒有其它的記憶體開銷。
修改了a,就影響了b;同理,修改了b就影響了a。
a =[1
,2,3
,"hello",[
"python"
,"c++"]]
b = a
"add"
)print
("a="
,a,"b="
,b)#a=[1, 2, 3, 'hello', ['python', 'c++'], 'add'] b=[1, 2, 3, 'hello', ['python', 'c++'], 'add']
淺拷貝會建立新物件,其內容是原物件的引用。
淺拷貝有三種形式:切片操作,工廠函式,copy模組中的copy函式。
比如對上述a:
1、切片操作:b = a[:] 或者 b = [each for each in a]
2、工廠函式:b = list(a)
3、copy函式:b = copy.copy(a)
淺拷貝產生的b不再是a了,使用is可以發現他們不是同乙個物件,使用id檢視,發現它們也不指向同一片記憶體。但是當我們使用 id(x) for x in a 和 id(x) for x in b 時,可以看到二者包含的元素的位址是相同的。
a =[1
,2,3
,"hello",[
"python"
,"c++"]]
b = a[:]
print(id
(a)==
id(b)
)# false
for i in
range
(len
(a))
:print(id
(a[i])==
id(b[i]))
# all true
"add"
)print
("a"
, a,
"b", b)
# a [1, 2, 3, 'hello', ['python', 'c++']] b [1, 2, 3, 'hello', ['python', 'c++'], 'add']
但是要注意,淺拷貝之所以稱為淺拷貝,是它僅僅只拷貝了一層,在a中有乙個巢狀的list,如果我們修改了它,情況就不一樣了。
深拷貝只有一種形式,copy模組中的deepcopy函式。
和淺拷貝對應,深拷貝拷貝了物件的所有元素,包括多層巢狀的元素。因而,它的時間和空間開銷要高。
同樣對la,若使用b = copy.deepcopy(a),再修改b將不會影響到a了。即使巢狀的列表具有更深的層次,也不會產生任何影響,因為深拷貝出來的物件根本就是乙個全新的物件,不再與原來的物件有任何關聯。
import copy
a =[1,
2,3,
"hello",[
"python"
,"c++"]]
b = copy.deepcopy(a)
print(id
(a)==
id(b)
)# false
for i in
range
(len
(a))
:print(id
(a[i])==
id(b[i]))
# true true true true false
print(id
(a[-1]
[0])
==id
(b[-1]
[0])
)# true
print(id
(a[-1]
[1])
==id
(b[-1]
[1])
)# true
"add"
)print
("a="
, a,
"b="
, b)
# a [1, 2, 3, 'hello', ['python', 'c++']] b [1, 2, 3, 'hello', ['python', 'c++'], 'add']
1、對於非容器型別,如數字,字元,以及其它「原子」型別,沒有拷貝一說。產生的都是原物件的引用。
2、如果元組變數值包含原子型別物件,即使採用了深拷貝,也只能得到淺拷貝。
Python賦值與深淺拷貝
a 1,2,3 b a a 4,5,6 賦新的值給 a a 4,5,6 b 1,2,3 a 的值改變後,b 並沒有隨著 a 變 a 1,2,3 b a a 0 a 1 a 2 4,5,6 改變原來 list 中的元素 a 4,5,6 b 4,5,6 a 的值改變後,b 隨著 a 變了 上面兩段 中,...
賦值與深淺拷貝
a 1 b a a 2 print a a print b b 列印出結果 a 2 b 1 解析 當a 1的時候,記憶體中開闢兩個空間,乙個空間存放數字1,乙個空間存放數字1的實體地址0x52446c40,當b a的時候,是將a的值賦予b,記憶體中會開闢另乙個空間也是存放數字1的實體地址0x5244...
python中的深淺拷貝與賦值。
賦值 賦值就是乙個變數引用乙個變數的值。這兩個變數共用乙個記憶體位址。當使用可變資料結構時 如 list,dict,set 其中乙個變數的值改變,會使另乙個變數的值也發生改變,但記憶體位址不改變。a 1 2,3 b ab 1 4print id a a,id b b 1992269718152 1,...