python附加2d列表无法正常工作是一个bug吗?

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()

我在将列表附加到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():
    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
的类型
a
a[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])