python物件引用 深淺拷貝

2021-08-26 12:15:56 字數 840 閱讀 9482

python是引用計數的方式來管理的。那麼python 真的是「傳物件引用?

實際上,python是採用傳值和傳引用結合的一種方式。如果函式收到的是乙個可變物件(比如字典或者列表)的引用,就能修改物件的原始值——相當於通過「傳引用」來傳遞物件。如果函式收到的是乙個不可變物件(比如數字、字元或者元組)的引用,就不能直接修改原始物件——相當於通過傳值來傳遞物件。

1.賦值是將乙個物件的位址賦值給乙個變數,讓變數指向改位址(舊瓶裝舊酒)

2.淺拷貝是在另一塊記憶體中建立乙個新的變數或容器,但是容器內儲存的是原物件元素的位址,也就是說新的容器指向了舊的元素。(新瓶裝舊酒)所以對資料內可變資料型別有影響。

3.深拷貝是在另一塊記憶體中建立乙個新的變數或容器,但是容器內儲存的是原物件元素的位址,也就是說新的容器指向了舊的元素的。(新瓶裝新酒)

import copy

a = [1,2,['a',]]

b = a

c = copy.copy(a) # 淺拷貝

d = copy.deepcopy(a) # 深拷貝

print(a)

print(b)

print(c)

print(d)

輸出:[1, 2, ['a', 'b'], 3]

[1, 2, ['a', 'b'], 3]

[1, 2, ['a', 'b']] # 這裡影響了巢狀的列表

[1, 2, ['a']]

python 深淺拷貝案例 python 深淺拷貝

深淺拷貝 對於 數字 和 字串 而言,賦值 淺拷貝和深拷貝無意義,因為其永遠指向同乙個記憶體位址 import copy a1 22255 a2 22255 print id a1 id a2 3428240 3428240 對於字典 元祖 列表 而言,進行賦值 淺拷貝和深拷貝時,其記憶體位址的變化...

python 深淺拷貝

建立乙個寬度為3,高度為4的陣列 mylist 0 3 4 0,0,0 0,0,0 0,0,0 0,0,0 但是當操作mylist 0 1 1時,發現整個第二列都被賦值,變成 0,1,0 0,1,0 0,1,0 0,1,0 list n n shallow copies of list concat...

python深淺拷貝

python 深淺拷貝 shallow copy 和 deep copy 對於乙個列表,列表裡面可以再放入乙個列表 1 若想複製這乙個列表,使用列表的普通的copy 方法,只能拷貝出列表裡表層的元素,而列表裡的列表卻無法拷貝,只能指向前乙個列表.修改拷貝出的列表裡列表裡的元素,原來的列表會發生改變....