我正在阅读学习python5e书中关于list的主题。 我注意到,如果我们对列表进行连接,它会创建新的对象。扩展方法不创建新对象,即就地更改。 在串联的情况下会发生什么?你知道吗
例如
l = [1,2,3,4]
m = l
l = l + [5,6]
print l,m
#output
([1,2,3,4,5,6], [1,2,3,4])
如果我使用如下的增广赋值
l = [1,2,3,4]
m = l
l += [5,6]
print l,m
#output
([1,2,3,4,5,6], [1,2,3,4,5,6])
在两种操作的情况下,后台发生了什么?你知道吗
通过检查内存中引用的对象,可以更好地理解这一点。让我们使用^{} for the inspection
在第一种情况下:
请注意,
l = l + [5,6]
在内存中创建了一个新对象,并且l
引用了该对象。你知道吗在第二种情况下:
l += [5,6]
对内存中同一对象的引用。结果就是这样。 所以,基本上+=
相当于inplaceadd。。More on this can be read here这里使用了两种方法:
__add__
和__iadd__
。l + [5, 6]
是l.__add__([5, 6])
的快捷方式。l
的__add__
方法返回加法的结果。因此,l = l + [5, 6]
是将l
重新分配给l
和[5, 6]
的加法。它不会影响m
,因为您没有更改对象,而是重新定义了名称。l += [5, 6]
是l.__iadd__([5, 6])
的快捷方式。在本例中,__iadd__
更改列表。因为m
引用同一个对象,所以m
也会受到影响。你知道吗编辑:如果
__iadd__
未实现,例如使用tuple
和str
等不可变类型,则Python使用__add__
。例如,x += y
将转换为x = x + y
。此外,在x + y
中,如果x
未实现__add__
,则将使用y.__radd__(x)
(如果可用)。因此x += y
可能是背景中的x = y.__radd__(x)
。你知道吗相关问题 更多 >
编程相关推荐