首页 > 后端开发 > Python教程 > Python 的 = 运算符如何处理列表及其 __iadd__ 和 __add__ 方法?

Python 的 = 运算符如何处理列表及其 __iadd__ 和 __add__ 方法?

DDD
发布: 2025-01-01 04:32:09
原创
801 人浏览过

How Does Python's  = Operator Behave with Lists and Their __iadd__ and __add__ Methods?

列表上的赋值运算符 = 揭晓

在 Python 中,= 运算符根据其所应用的对象类型具有不同的功能。当在列表上使用时,它会引发一些意外的行为,这些行为可以通过理解它调用的底层特殊方法来解释。

通常, = 尝试调用 __iadd__ 特殊方法进行就地添加。如果不存在,则使用 __add__ 来代替。

使用 __iadd__ 进行就地修改

对于列表这种可变类型,Python 提供了 __iadd__ 方法。当遇到 = 时,Python 会在列表上调用 __iadd__,允许其变异并添加元素。

使用 __add__ 创建新对象

如果列表没有 __iadd__ 方法,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)

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__ 和 __add__ 均未定义。因此, = 创建一个新列表并将其分配给 bar 属性,该属性在所有实例之间共享。
  • 对于 foo2,定义了 __add__ 但未定义 __iadd__。因此, = 创建一个新列表,将其分配给 bar 属性而不修改共享列表。

通过了解 __iadd__ 和 __add__ 之间的差异,您可以预测 = 在列表上的行为,防止意外的情况发生惊喜。

以上是Python 的 = 运算符如何处理列表及其 __iadd__ 和 __add__ 方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板