为什么这个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()
扩展inplacea
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()
扩展inplacea
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
中的第二个元素。相关: