我遇到了将列表追加到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']]
答案 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]]
的原因。