考虑这段代码?
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().
你为什么得到这个输出?
因为如果您使用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 += y的lists是不等同于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)
将导致a并b成为两者[1,2].当然,通常+=应该表现得像添加,但添加完成就地这可能会有一些影响.
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |