python賦值拷貝操作中的坑

2021-10-05 23:06:27 字數 909 閱讀 2462

最近發現list_a = list_b這種方式其實是多了乙個引用,而不是真正的拷貝,這個坑之前從未發現,特此記錄

對於數字、字串、元組這些不可變物件,對賦值後的新物件修改不影響原物件

>>> a=0

>>> a

0>>> b=a

>>> b

0>>> b=1

>>> b

1>>> a

0

對於列表、字典、集合,直接賦值相當於多乙個引用,實際兩個物件是乙個內容,修改乙個另乙個也會變

>>> a=[1,2,3]

>>> a

[1, 2, 3]

>>> b=a

>>> b

[1, 2, 3]

>>> b[0]=0

>>> b

[0, 2, 3]

>>> a

[0, 2, 3]

解決方法是,要麼新建乙個,然後挨個賦值,或者使用copy中的copy

>>> import copy

>>> a=[1,2,3]

>>> b=copy.copy(a)

>>> b

[1, 2, 3]

>>> b[0]=0

>>> b

[0, 2, 3]

>>> a

[1, 2, 3]

但是這是淺拷貝,如果可變物件裡還有可變物件,比如

>>> a=[1,2,3]

>>> b=[a]

這樣對b進行淺拷貝後,a的改變仍然會影響所有包含a的可變物件,解決方式是使用深拷貝copy.deepcopy()。

總的來說就是,python中的可變物件拷貝時要慎重。

python中的賦值 淺拷貝 深拷貝

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 import copy a 1,2,x y b ac copy.copy a d copy.deepcopy a print id b id a i...

Python中賦值 淺拷貝與深拷貝

原文 python中關於物件複製有三種型別的使用方式,賦值 淺拷貝與深拷貝。他們既有區別又有聯絡,剛好最近碰到這一類的問題,研究下。一 賦值 在python中,物件的賦值就是簡單的物件引用,這點和c 不同。如下 list a 1,2,3,hello python c list b list a 這種...

Python中賦值 淺拷貝與深拷貝

python中關於物件複製有三種型別的使用方式,賦值 淺拷貝與深拷貝。他們既有區別又有聯絡,剛好最近碰到這一類的問題,研究下。一 賦值 在python中,物件的賦值就是簡單的物件引用,這點和c 不同。如下 list a 1,2,3,hello python c list b list a 這種情況下...