首页 >后端开发 >Python教程 >为什么列表上的 Python = 运算符会产生意外的共享状态行为?

为什么列表上的 Python = 运算符会产生意外的共享状态行为?

Linda Hamilton
Linda Hamilton原创
2024-12-14 17:08:18873浏览

Why Does Python's  = Operator on Lists Produce Unexpected Shared-State Behavior?

= 运算符在列表上的意外行为

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 可用,从而创建一个新对象。

总结:

  • = 使用 iadd(如果已定义),修改对象就地。
  • 如果未定义 iadd,= 回退到 __add__,创建一个新对象。
  • 对于可变对象,= 就地修改对象.
  • 对于不可变对象,= 创建一个新对象。

以上是为什么列表上的 Python = 运算符会产生意外的共享状态行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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