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

为什么这个python代码给出[3,3]?,python,list,Python,List,考虑一下这个代码 b = [[5], [3]] a = b[1] b[-1] += b.pop() print(a) 这就给出了[3,3] 你不能通过把b[-1]+=b.pop()扩展到b[-1]=b[-1]+b.pop()来解释它 为什么会得到此输出?在打印a之前,请尝试打印b[-1]。b[-1]指的是b中的最后一个元素,您正在向其中添加另一个元素。出现这种情况的原因似乎是,当您执行a=b[1]时,必须通过引用来分配它,因为a在更新b[1](在本例中与b[-1]相同)时会更新。请在打印a之前

考虑一下这个代码

b = [[5], [3]]
a = b[1]
b[-1] += b.pop()
print(a)
这就给出了
[3,3]

你不能通过把
b[-1]+=b.pop()
扩展到
b[-1]=b[-1]+b.pop()
来解释它


为什么会得到此输出?

在打印a之前,请尝试打印b[-1]。b[-1]指的是b中的最后一个元素,您正在向其中添加另一个元素。出现这种情况的原因似乎是,当您执行
a=b[1]
时,必须通过引用来分配它,因为a在更新b[1](在本例中与b[-1]相同)时会更新。

请在打印a之前尝试打印b[-1]。b[-1]指的是b中的最后一个元素,您正在向其中添加另一个元素。出现这种情况的原因似乎是,当您执行
a=b[1]
操作时,必须通过引用来分配它,因为在更新b[1](在本例中与b[-1]相同)时,a会被更新。

因为如果使用
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]]
(当然还有
tmp
,上面的片段是在解释器级别完成的)

现在
tmp
b
中第二个列表的参考(因此
tmp是一个
)。因此,这意味着您可以使用
b.pop()
扩展inplace
a
b.pop()
[3]
。因此,您要做的是使用
tmp
扩展
tmp
(此时为
[3]
)。因此
tmp
(因此
a
变成
[3,3]
)。所以
b
现在是
[[3,3]]

请注意,
列表
s的
x+=y
并不等同于
x=x+y
。事实上,如果您编写如下代码:

>>> a = [1]
>>> b = a
>>> b = b + [2]
>>> print(a,b)
[1] [1, 2]
这将不会更新
a
(因为它不是在本地完成的)。鉴于:

>>> a = [1]
>>> b = a
>>> b += [2]
>>> print(a,b)
[1, 2] [1, 2]

将导致
a
b
同时
[1,2]
。当然,通常情况下,
+=
的行为应该类似于添加,但是添加是在原地完成的,这可能会产生一些效果。

因为如果使用
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]]
(当然还有
tmp
,上面的片段是在解释器级别完成的)

现在
tmp
b
中第二个列表的参考(因此
tmp是一个
)。因此,这意味着您可以使用
b.pop()
扩展inplace
a
b.pop()
[3]
。因此,您要做的是使用
tmp
扩展
tmp
(此时为
[3]
)。因此
tmp
(因此
a
变成
[3,3]
)。所以
b
现在是
[[3,3]]

请注意,
列表
s的
x+=y
并不等同于
x=x+y
。事实上,如果您编写如下代码:

>>> a = [1]
>>> b = a
>>> b = b + [2]
>>> print(a,b)
[1] [1, 2]
这将不会更新
a
(因为它不是在本地完成的)。鉴于:

>>> a = [1]
>>> b = a
>>> b += [2]
>>> print(a,b)
[1, 2] [1, 2]

将导致
a
b
同时
[1,2]
。当然,通常情况下,
+=
的行为应该类似于添加,但是添加是在原地完成的,这可能会产生一些效果。

首先,列表b中只有2个元素

b = [[5], [3]]
a = b[1]

print b[1] 
# gives [3]
print b[-1] 
# also gives [3] because here -1 refers to the last element and there are 
# only two elements.

b[-1] += b.pop()
# here you are appending 3 to [3] of b

print b[-1] 
print a
# that is why when you print a it gives [3,3] as the b[1] value was 
# appended to a in the second step itself and you are just printing here.

希望你明白我想说的。

首先,列表b中只有两个元素

b = [[5], [3]]
a = b[1]

print b[1] 
# gives [3]
print b[-1] 
# also gives [3] because here -1 refers to the last element and there are 
# only two elements.

b[-1] += b.pop()
# here you are appending 3 to [3] of b

print b[-1] 
print a
# that is why when you print a it gives [3,3] as the b[1] value was 
# appended to a in the second step itself and you are just printing here.

希望你明白我想说的。

你具体想问什么部分?@Carcigenicate在结尾
b=[[3,3]]
。那么
a=[3,3]
a=b[1]
时是如何进行的呢?
a
b[1]
初始化时的列表。它没有链接到
b
中的第二个元素。相关:您具体询问的是什么部分?@Carcigenicate在
b=[[3,3]]
末尾。那么
a=[3,3]
a=b[1]
时是如何进行的呢?
a
b[1]
初始化时的列表。它未链接到
b
中的第二个元素。相关: