首页 >后端开发 >Python教程 >Python 的 = 运算符如何根据 __iadd__ 和 __add__ 对列表产生不同的影响?

Python 的 = 运算符如何根据 __iadd__ 和 __add__ 对列表产生不同的影响?

Susan Sarandon
Susan Sarandon原创
2024-12-22 04:36:13372浏览

How Does Python's  = Operator Differentially Affect Lists Depending on __iadd__ and __add__?

= 运算符如何在 Python 中对列表进行操作

Python 中的 = 运算符在应用于列表时会表现出意外的行为。此行为归因于 iaddadd 特殊方法之间的区别。

iaddadd

  • __iadd__':就地添加;改变被操作的对象。
  • __add__': 返回一个新对象;用于标准运算符。

列表上的行为

当 = 在具有 iadd 方法的列表上使用时,列表已就地修改。如果未定义 iadd,则调用 add,从而生成一个新列表。

示例

考虑以下内容code:

class foo:
    bar = []
    def __init__(self, x):
        self.bar += [x]

class foo2:
    bar = []
    def __init__(self, x):
        self.bar = self.bar + [x]

f = foo(1)
g = foo(2)
print(f.bar)
print(g.bar)

f.bar += [3]
print(f.bar)
print(g.bar)

f.bar = f.bar + [4]
print(f.bar)
print(g.bar)

f = foo2(1)
g = foo2(2)
print(f.bar)
print(g.bar)

输出

[1, 2]
[1, 2]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3]
[1]
[2]

解释

  • foo 实现了 __iadd__,所以 = 修改f.bar,导致它影响所有实例foo.
  • foo2 缺少 __iadd__,所以 = 触发 __add__,返回一个新列表来替换 f.bar。
  • foo2 保留其原始 bar 列表,而 foo 修改它

结论

= 在列表上的行为取决于它是否调用 iaddadd__。就地修改通过 __iadd__ 进行,而 __add 创建一个新列表。

以上是Python 的 = 运算符如何根据 __iadd__ 和 __add__ 对列表产生不同的影响?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn