python append 2d list不能按预期工作是一个错误?

时间:2019-04-12 04:33:29

标签: 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():
    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']]

1 个答案:

答案 0 :(得分:1)

以下两段代码之间存在根本区别:

a = [1, 1, 1]
b.append(a)
a[0] = 0
b.append(a)

a = [1, 1, 1]
b.append([*a])
a[0] = 0
b.append([*a])

在第一种情况下,每次都将相同的引用附加到b上。当您使用a修改原始列表a[0] = 0的元素时,对该列表的所有引用都可以看到更改。因此,b将是[[0, 1, 1], [0, 1, 1]],而不是[[1, 1, 1], [0, 1, 1]]

在第二种情况下,[*a]创建一个包含a所有元素的副本的新列表。当您更新原始列表时,b中已存在的引用不会指向同一列表,因此保持不变。这就是b将成为[[1, 1, 1], [0, 1, 1]]的原因。