list.__iadd__ 和 list.__add__ 的不同行为
- 2025-01-14 08:50:00
- admin 原创
- 122
问题描述:
考虑以下代码:
>>> x = y = [1, 2, 3, 4]
>>> x += [4]
>>> x
[1, 2, 3, 4, 4]
>>> y
[1, 2, 3, 4, 4]
然后考虑一下:
>>> x = y = [1, 2, 3, 4]
>>> x = x + [4]
>>> x
[1, 2, 3, 4, 4]
>>> y
[1, 2, 3, 4]
这两者为何有区别?
(是的,我尝试搜索这个)。
解决方案 1:
__iadd__
改变列表,而__add__
返回一个新列表,如图所示。
表达式x += y
首先尝试调用__iadd__
,如果调用失败,则调用__add__
后进行赋值(请参阅 Sven 的评论以进行微小更正)。因为list
has__iadd__
之后它就执行了这一小段变异魔法。
解决方案 2:
第一个改变列表,第二个重新绑定名称。
解决方案 3:
1)'+=' 调用就地添加,即iadd方法。此方法接受两个参数,但会就地进行更改,修改第一个参数的内容(即修改 x)。由于 x 和 y 都指向同一个 Pyobject,因此它们都是相同的。
2)而 x = x + [4] 调用add方法(x.add ( [4])),而不是就地更改或添加值,而是创建一个新列表,a 现在指向该列表,y 仍然指向 old_list。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD