为什么这个python代码给出了[3,3]?

ele*_*ora 1 python list

考虑这段代码?

b = [[5], [3]]
a = b[1]
b[-1] += b.pop()
print(a)
Run Code Online (Sandbox Code Playgroud)

这给了[3,3].

似乎无法通过扩展b[-1] += b.pop()来解释它b[-1] = b[-1] + b.pop().

你为什么得到这个输出?

Wil*_*sem 6

因为如果您使用b[-1]第二个列表+=引用仅获取一次,则接下来操作完成,最后将其存储回列表中.所以b[-1] += b.pop()基本上相当于:

tmp = b[-1]  # tmp = [3]
tmp += b.pop() # tmp = [3,3], b = [[5]]
b[-1] = tmp # tmp = [3,3], b = [[3,3]]
Run Code Online (Sandbox Code Playgroud)

(但当然有tmp,上面的片段是在翻译层完成的)

现在tmp是对(so )中第二个列表的反驳.因此,这意味着您扩展就地使用.是.所以你所做的就是延伸(就在那一刻).所以(从而成为).所以现在.btmp is a ab.pop()b.pop()[3]tmp[3]tmptmpa[3,3]b[[3,3]]

介意x += ylists是不等同于x = x+y.的确,如果您编写如下代码:

>>> a = [1]
>>> b = a
>>> b = b + [2]
>>> print(a,b)
[1] [1, 2]
Run Code Online (Sandbox Code Playgroud)

不会更新a(因为它没有在原地完成).鉴于:

>>> a = [1]
>>> b = a
>>> b += [2]
>>> print(a,b)
[1, 2] [1, 2]
Run Code Online (Sandbox Code Playgroud)

将导致ab成为两者[1,2].当然,通常+=应该表现得像添加,但添加完成就地这可能会有一些影响.