python附加2d列表无法正常工作是一个bug吗?
我在将列表附加到2D列表时遇到了一个问题。在下面的代码中,如果我将python附加2d列表无法正常工作是一个bug吗?,python,python-3.x,append,Python,Python 3.x,Append,我在将列表附加到2D列表时遇到了一个问题。在下面的代码中,如果我将b.append(a)更改为b.append([*a])一切正常!但是a和[*a]不一样吗 a = ['1', '1', '1'] b = [] def call_other(ar): a[0], a[1], a[2] = ar[0], ar[1], ar[2] print('a is', a) b.append(a) print('b is', b) print() def lop()
b.append(a)
更改为b.append([*a])
一切正常!但是a
和[*a]
不一样吗
a = ['1', '1', '1']
b = []
def call_other(ar):
a[0], a[1], a[2] = ar[0], ar[1], ar[2]
print('a is', a)
b.append(a)
print('b is', b)
print()
def lop():
for i in range(5):
c = ['0', '1', '1']
if i > 1:
c = ['1', '0', '1']
call_other(c)
lop()
print('final b:', b)
输出为:
a is ['0', '1', '1']
b is [['0', '1', '1']]
a is ['0', '1', '1']
b is [['0', '1', '1'], ['0', '1', '1']]
a is ['1', '0', '1']
b is [['1', '0', '1'], ['1', '0', '1'], ['1', '0', '1']]
a is ['1', '0', '1']
b is [['1', '0', '1'], ['1', '0', '1'], ['1', '0', '1'], ['1', '0', '1']]
a is ['1', '0', '1']
b is [['1', '0', '1'], ['1', '0', '1'], ['1', '0', '1'], ['1', '0', '1'], ['1', '0', '1']]
final b: [['1', '0', '1'], ['1', '0', '1'], ['1', '0', '1'], ['1', '0', '1'], ['1', '0', '1']]
以下两段代码之间存在根本区别:
a = [1, 1, 1]
b.append(a)
a[0] = 0
b.append(a)
及
在第一种情况下,每次都将相同的引用附加到b
。当您使用a[0]=0
修改原始列表a
的元素时,该更改将对该列表的所有引用可见<因此,代码>b将是[[0,1,1],[0,1,1]]
,而不是[[1,1,1],[0,1,1]]
在第二种情况下,
[*a]
创建一个新列表,其中包含a
的所有元素的副本。更新原始列表时,b
中已有的引用不指向同一列表,因此保持不变。这就是为什么b
将是[[1,1,1],[0,1,1]]
什么是一切工作的样子?a
和[*a]
可能不同,这取决于a
的类型aa[0],a[1],a[2]=ar[0],ar[1],ar[2]
a=ar[:]或a=ar:3]
。两个都是副本。看看打印出来的最终b应该以[0 1 1]开始,明白了!当b.append(a)将a的指针传递给b而不是复制值时。非常感谢。
a = [1, 1, 1]
b.append([*a])
a[0] = 0
b.append([*a])