Python列表:为什么在连接操作之后创建新的列表对象?

2024-09-26 22:09:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在阅读学习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])

在两种操作的情况下,后台发生了什么?你知道吗


Tags: 对象方法主题列表output情况list后台
2条回答

通过检查内存中引用的对象,可以更好地理解这一点。让我们使用^{} for the inspection

在第一种情况下:

>>> l = [1,2,3,4]
>>> id(l)
4497052232
>>> m = l
>>> id(m)
4497052232
>>> l = l + [5,6]
>>> id(l)
4497052448
>>> print l, id(l), m, id(m)
[1, 2, 3, 4, 5, 6] 4497052448 [1, 2, 3, 4] 4497052232
>>> 

请注意,l = l + [5,6]在内存中创建了一个新对象,并且l引用了该对象。你知道吗

在第二种情况下:

>>> l = [1,2,3,4]
>>> id(l)
4497052520
>>> m = l
>>> id(m)
4497052520
>>> l += [5,6]
>>> id(l)
4497052520
>>> print l, id(l), m, id(m)
[1, 2, 3, 4, 5, 6] 4497052520 [1, 2, 3, 4, 5, 6] 4497052520
>>> 

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__未实现,例如使用tuplestr等不可变类型,则Python使用__add__。例如,x += y将转换为x = x + y。此外,在x + y中,如果x未实现__add__,则将使用y.__radd__(x)(如果可用)。因此x += y可能是背景中的x = y.__radd__(x)。你知道吗

相关问题 更多 >

    热门问题