正如您所注意到的,anotherObject = someObject
不制作副本 - 如果您想要副本,请尝试
import copy
otherObject = copy.copy(someObject)
copy.copy
vs的copy.deepcopy
区别在这里很重要-您可以摆脱copy.copy
所描述的简单对象,但更嵌套的对象将需要copy.deepcopy
.
copy.copy(someObject)
仅复制 object someObject
,但如果someObject
包含对其他可以更改的对象(“可变”对象)的引用,如
someObject.value.this_one_has_values_too = 4
或者
someObject.value[0] = 1
或者
someObject.value['key'] = 'value'
然后将在副本中引用这些对象。如果您使用copy.deepcopy
,它们也会被复制过来。
了解这一点的一个好方法是使用Online Python Tutor(参见链接示例),但这里是一个直接的行为演示,没有 Online 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 的引用时使用该对象。
需要阅读的是 Ned's Facts and Myths about Python names and values。