正如你已經注意到,anotherObject = someObject
不會使副本 - 如果你要一個副本,嘗試
import copy
otherObject = copy.copy(someObject)
的copy.copy
VS copy.deepcopy
區別在這裏很重要 - 你可以通過copy.copy
獲得你所描述的簡單對象,但是更多的嵌套對象需要copy.deepcopy
。
copy.copy(someObject)
僅使對象someObject
的副本,但如果someObject
包含對可以改變其它的目的(「可變」對象)的引用在
someObject.value.this_one_has_values_too = 4
或
someObject.value[0] = 1
或
someObject.value['key'] = 'value'
then 參考文獻將在複製中製作這些對象。如果您使用copy.deepcopy
,它們也會被複制。
瞭解這一點的好方法是使用Online Python Tutor(請參閱鏈接的例子),但這裏直接演示了沒有有用的圖形化在線Python Tutor提供的行爲。
>>> import copy
>>> class Foo(object):
... pass
...
>>> f = Foo()
>>> f.value = 1
>>> f.nested_value = [2,3,4]
>>> deep = copy.deepcopy(f)
>>> deep.value = 5
>>> f.value
1
>>> deep.nested_value.append(6)
>>> f.nested_value
[2, 3, 4]
>>> shallow = copy.copy(f)
>>> shallow.value = 7
>>> f.value
1
>>> shallow.nested_value.append(8)
>>> f.nested_value
[2, 3, 4, 8]
編輯:但是第一個例子中的整數呢?它實際上是在f
對象和shallow
對象之間共享的,但這不是問題 - 它不可編輯;我們無法改變一個整數對象像1
是任何不同,所以我們還不如節省內存,並使用一個對象任何時候任何Python對象需要1
的事情參考閱讀有關這內德的Facts and Myths about Python names and values。
是什麼'copy'和'deepcopy'之間的區別?另外,你是什麼意思「嵌套對象」?我是python的新手,我只是想盡可能地學習。 –
@ coder108是否有意義?如果沒有,請讓我知道什麼不能,以便我可以改進答案。 – Thomas
哦,我明白你的意思是'嵌套對象'。出於好奇,是不是一個整數也是一個對象?爲什麼不需要'deepcopy'呢?謝謝你的鏈接,順便說一句。這非常有用。 –