为什么在Python中发生这种情况?是否与列表可变性有关?

Adi*_*tya 4 python

如果我的问题非常简单或明显,请不要苛刻.我是一个Python新手,所以刚刚开始.

实际上这只是我在Stack Overflow上遇到的一段代码,但是找不到为什么会发生这种情况的答案,所以决定自己问一下.

我写了以下两个程序:

1)

x=[1,2,3]
y=x
print x
y=y+[3,2,1]
print x
Run Code Online (Sandbox Code Playgroud)

输出:

[1,2,3]
[1,2,3]
Run Code Online (Sandbox Code Playgroud)

2)

x=[1,2,3]
y=x
print x
y+=[3,2,1]
print x
Run Code Online (Sandbox Code Playgroud)

输出:

[1,2,3]
[1,2,3,3,2,1]
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这两种输出在这种情况下是不同的?是y=y+(something)不一样的y+=(something)

我在这里失踪的是什么?

非常感谢帮助我解决这个问题

Ult*_*nct 5

这与可变性无关.它与列表对象和对它的引用有关.

当你这样做时:

y=x
Run Code Online (Sandbox Code Playgroud)

您实际上是在y引用相同的列表x.

现在,

y=y+[3,2,1]
  ^-------^  - Create a **new** List is that is equal to concatenation of `y` and [1,2,3]
^---^        - Bind variable `y` to this **new** list.
             - The original list which `x` refered to -- is still *intact*
Run Code Online (Sandbox Code Playgroud)

再次,

y+=[3,2,1]
 ^-------^   - Append [1,2,3] **in-place**. 
             - Since even `x` is pointing to the same list, it gets modified.
Run Code Online (Sandbox Code Playgroud)

  • 简而言之 - 对于一个列表:`+ =`(`__ iadd__`)实际上是`list.extend` (2认同)