首页  >  文章  >  后端开发  >  为什么 `list.__iadd__` 会修改原始列表和分配的列表,而 `list.__add__` 只修改分配的列表?

为什么 `list.__iadd__` 会修改原始列表和分配的列表,而 `list.__add__` 只修改分配的列表?

Susan Sarandon
Susan Sarandon原创
2024-10-30 17:05:25532浏览

Why does `list.__iadd__` modify both original and assigned lists, while `list.__add__` only modifies the assigned list?

list.__iadd__ 和 list.__add__

之间的行为差​​异

<code class="python">x = y = [1, 2, 3, 4]
x += [4]
print(x)  # Outputs: [1, 2, 3, 4, 4]
print(y)  # Outputs: [1, 2, 3, 4, 4]</code>

考虑以下代码片段:

<code class="python">x = y = [1, 2, 3, 4]
x = x + [4]
print(x)  # Outputs: [1, 2, 3, 4, 4]
print(y)  # Outputs: [1, 2, 3, 4]</code>

相反,观察这个:

为什么这两个代码片段的行为不同?

解释

  • 关键的区别在于使用“ “ 操作员。在第一个片段中:

    • x = [4] 使用列表类的 __iadd__ 方法,该方法:
    • 改变原始列表 (x) -place
  • 使用第二个列表 ([4]) 中的元素扩展它

这会导致 x 和 y 都被修改以包含该值4.
  • 但是,在第二个片段中,x = x [4] 使用 __add__ 方法:
  • x [4] 通过连接 x 与 [4] 创建一个新列表
  • 然后 x 变量被重新分配给这个新列表

y 保持不变,因为它是一个不同的对象

因此,x 的值为 [1, 2 , 3, 4, 4] 而 y 仍保持原始值 [1, 2, 3, 4]。

以上是为什么 `list.__iadd__` 会修改原始列表和分配的列表,而 `list.__add__` 只修改分配的列表?的详细内容。更多信息请关注PHP中文网其他相关文章!

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