= 运算符在列表上的意外行为
Python 中的 = 运算符在对列表进行操作时会出现意外行为,如以下代码所示代码片段:
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)
输出:
[1, 2] [1, 2]
= 运算符似乎会影响该类的每个实例,而 foo = foo bar 的行为符合预期。
此行为源于 = 运算符的底层实现。它首先尝试调用 iadd 特殊方法,该方法用于就地添加并修改它所作用的对象。如果 iadd 不可用,则会回退到 add 特殊方法,该方法返回一个新对象。
对于列表,仅 add 被定义,它返回一个新列表。因此,当在列表上使用 = 时,它会创建一个新列表,而不是改变现有列表。这解释了为什么 f 和 g 在上面的示例中共享相同的 bar 列表。
= 运算符对于可变对象的行为有所不同,它通过 iadd 方法就地修改它们。对于字符串和整数等不可变对象,只有 add 可用,从而创建一个新对象。
总结:
以上是为什么列表上的 Python = 运算符会产生意外的共享状态行为?的详细内容。更多信息请关注PHP中文网其他相关文章!