基本上,当使用list.append()将一个列表添加到另一个列表时,似乎存在一个问题。问题是,整个列被更改为您为给定的索引设置的值。例如下面的代码
b = [1,1,1]
c = []
c.append(b)
c.append(b)
c.append(b)
c[0][0] = 4
,如果你输出c,你会得到:[[4 1 1] [4 1 1] [4 1 1]]而不是[[4 1 1] [1, 1, 1] [1, 1, 1]]
所以我的问题是,你怎么才能最终把列表放在右边,而不是实际发生的事情
你所观察到的是Python中正常和预期的行为,任何像样的教程都应该涵盖它。
c.append(b)
c.append(b)
c.append(b)
在c
上追加三个对列表b
的引用。因为它是相同的列表,改变一个引用会改变它被引用的所有四个地方,顺便说一下,包括b
。
如果你不想要这个行为,复制列表。
c.append(b[:])
c.append(b[:])
c.append(b[:])
每次添加一个新的列表:
b = [1,1,1]
c = []
c.append(list(b))
c.append(list(b))
c.append(list(b))
c[0][0] = 4
您遇到问题的原因是因为列表存储为引用到实际列表对象-因此您的c
版本有相同引用的3个副本,所有指向相同的实际[1,1,1]
对象。使用list()
函数创建新的副本,以便引用指向不同的对象。