我为何时需要在Python中显式复制对象以进行更改而不更改原始对象时感到有些困惑。在Python的文档页面并没有太多的细节,并简单地说,“赋值语句不创建副本”。
范例1:
>>> a = 4
>>> b = a
>>> b += 1
>>> print(b)
>>> print(a)
# Results are what you'd "expect" them to be:
5
4
范例2:
>>> class Test():
>>> def __init__(self, x):
>>> self.x = x
>>>
>>> A = Test(4)
>>> B = A
>>> B.x += 1
>>> print(B.x)
>>> print(A.x)
# Unexpected results because B isn't actually a copy of A:
5
5
编辑:为了使示例2正常工作,我基本上做了以下工作。我在问为什么示例1不需要这样做:
>>> import copy
>>> A = Test(4)
>>> B = copy.copy(A)
>>> B.x += 1
>>> print(B.x)
>>> print(A.x)
a = 4
b = a
……的意思是“使人b
指a
所指”。在这种情况下为4。由于整数是不可改变的,改变b
这样做b += 1
会使它指向一个不同的对象
检查他们的ID:
a = 4
b = a
print(id(a)) # Same id
print(id(b)) # Same id
b = 123
print(id(b)) # Different id
当B不是a时,实例A和B也会发生相同的情况.copy()
。
id(对象)
返回对象的“身份”。
一个带有可变对象的有趣示例:
l = [1, 2]
k = l
print(id(l)) # Same id
print(id(k)) # Same id
k.append(3)
print(id(k)) # Same id
print(l, k) # Prints [1, 2, 3] [1, 2, 3]
append()
同时修改对象k
和l
引用。它不会为分配其他对象k
。
如@blcckngth所述:
k = k + [3]
print(id(k)) # Different id ..
print(l, k) # ..prints [1, 2] [1, 2, 3]
而k += [3]
会导致引用同一对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句