>>> list1 = []
>>> list2 = list1
>>> list2 += [1]
>>> print list1
[1]
比较
>>> list1 = []
>>> list2 = list1
>>> list2 = list2 + [1]
>>> print list1
[]
“+=”操作修改原始列表是否有原因?
编辑:只是为了让我的问题更清楚一些
在我所知道的大多数语言中,'+='-operator 不是这样工作的,我想知道为什么它在 python 中以这种方式设计。
一些例子:
ruby
irb(main):001:0> l = []
irb(main):002:0> a = l
irb(main):003:0> a += [2]
irb(main):004:0> l
=> []
Scala 等..
reference 存储的 Python 列表。
这意味着当您执行 list2 = list1
时,您并不是在复制列表 - 您只是在说“list2
指的是同一件事 list1
做”,即您在执行 list1 = []
时最初创建的列表。
Python 指定 +=
表示列表的“就地追加”,因为大多数时候当您在列表上使用 +=
时,这就是您想要的要做 - 您通常不希望每次添加元素时都创建新列表。
因此,当您追加到 list2
,它“指的是 list1
所指的同一对象”,然后从 list1
读取时,您看到附加的项目,正如预期的那样,因为它们都指向同一个列表。
但是,使用 +
时,总是会创建一个新列表,因为修改其中任何一个操作数都没有意义(因为 a+b
没有t 意味着修改 a
或 b
。
因此,当您执行 list2 = list2 + [1]
时,您创建了一个新列表,其中包含 list2
指向的原始对象的所有内容,并且还有 1
,然后说 list2
现在引用那个新列表。由于它现在引用的列表与 list1
不同,因此当您从 list1
读取时,您仍然会看到没有额外 1
的原始列表。