小能豆

Python 中“i += x”何时与“i = i + x”不同?

python

有人告诉我+=会产生与 标准符号 不同的效果。 是否存在与 不同的i = i +情况?i += 1i = i + 1


阅读 48

收藏
2024-06-27

共1个答案

小能豆

在大多数情况下,i += 1i = i + 1会产生相同的效果,尤其是对于整数、字符串和元组等不可变类型。但是,在某些情况下,这两种形式的递增可能会有不同的表现,尤其是对于可变类型。

不可变类型(例如整数)

对于整数等不可变类型,这两个语句实际上是相同的:

i = 5
i += 1  # This is equivalent to i = i + 1
print(i)  # Output: 6

这里,i += 1i = i + 1都增加i1,并且没有可观察到的差异。

可变类型(例如列表)

对于列表等可变类型,差异变得明显。请考虑以下示例:

# Example with lists
lst = [1, 2, 3]

# Using += (in-place addition)
lst += [4, 5]
print(lst)  # Output: [1, 2, 3, 4, 5]

# Reset list
lst = [1, 2, 3]

# Using + and assignment
lst = lst + [4, 5]
print(lst)  # Output: [1, 2, 3, 4, 5]

在此示例中,结果是相同的,但让我们更深入地探讨一下:

  • lst += [4, 5]就地修改lst,即就地添加。原始列表得到扩展。
  • lst = lst + [4, 5]创建新列表并将其分配给lst。原始列表不会被修改;而是创建新列表并将其分配给lst

就地与新对象

对于可变类型,关键区别在于操作是就地执行还是导致创建新对象。就地操作可能会产生副作用,尤其是当存在对同一对象的多个引用时。

考虑以下:

a = [1, 2, 3]
b = a
a += [4, 5]
print(a)  # Output: [1, 2, 3, 4, 5]
print(b)  # Output: [1, 2, 3, 4, 5] (b is also modified)

# Reset
a = [1, 2, 3]
b = a
a = a + [4, 5]
print(a)  # Output: [1, 2, 3, 4, 5]
print(b)  # Output: [1, 2, 3] (b is not modified)
  • 使用 时a += [4, 5]a和都b被修改,因为ab引用同一个列表。
  • 其中a = a + [4, 5]a引用新列表,而 则b保持不变。

总之,+=可以就地修改对象,而i = i + 1(或lst = lst + [...])创建一个新对象。处理可变对象时,这种区别很重要,并且可能导致代码中的不同行为。

2024-06-27