Python 这是虫子吗?由于名称相似而覆盖另一个列表的列表?

Python 这是虫子吗?由于名称相似而覆盖另一个列表的列表?,python,Python,我真的对这一点感到困惑,似乎第二个列表覆盖了第一个列表,而它们之间完全没有联系——它们是两个不同的列表。如果不是虫子,有人能解释一下原因吗?多谢各位 编辑:当跑道\ U添加列表是两个不同的列表时,它们将覆盖跑道\ U子列表。最后,我用单独的Runway_sub重新构建了这个过程,它正常工作 >>> rune_cynumbers [[53, 23, 67, 7, 17, 71, 31, 97, 2], [15, 8, 18, 3, 6, 19, 10, 24, 0], [16,

我真的对这一点感到困惑,似乎第二个列表覆盖了第一个列表,而它们之间完全没有联系——它们是两个不同的列表。如果不是虫子,有人能解释一下原因吗?多谢各位


编辑:当跑道\ U添加列表是两个不同的列表时,它们将覆盖跑道\ U子列表。最后,我用单独的Runway_sub重新构建了这个过程,它正常工作

>>> rune_cynumbers
[[53, 23, 67, 7, 17, 71, 31, 97, 2], [15, 8, 18, 3, 6, 19, 10, 24, 0], [16, 9, 19, 4, 7, 20, 11, 25, 1], [53, 23, 41, 67, 17, 71, 31, 107, 2], [15, 8, 12, 18, 6, 19, 10, 27, 0], [16, 9, 13, 19, 7, 20, 11, 28, 1]]
>>> rune_keynumbers
[[59, 23, 67, 31, 29, 53, 59, 97, 11], [16, 8, 18, 10, 9, 15, 16, 24, 4], [17, 9, 19, 11, 10, 16, 17, 25, 5], [5, 59, 67, 31, 29, 53, 59, 97, 11], [2, 16, 18, 10, 9, 15, 16, 24, 4], [3, 17, 19, 11, 10, 16, 17, 25, 5]]
>>> runeWay_sub = []
>>> runeWay_add = []
>>> for SET in rune_keynumbers:
...   micro_array = []
...   for i in SET:
...     micro_array.append(0)
...   runeWay_add.append(micro_array)
...   runeWay_sub.append(micro_array)
... 
>>> runeWay_add
[[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]
>>> runeWay_sub
[[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]
>>> for SET in enumerate(rune_keynumbers):
...   for i in enumerate(SET[1]):
...     runeWay_sub[SET[0]][i[0]] = rune_cynumbers[SET[0]][i[0]] - rune_keynumbers[SET[0]][i[0]]
...     runeWay_add[SET[0]][i[0]] = rune_cynumbers[SET[0]][i[0]] + rune_keynumbers[SET[0]][i[0]]
... 
>>> runeWay_sub
[[112, 46, 134, 38, 46, 124, 90, 194, 13], [31, 16, 36, 13, 15, 34, 26, 48, 4], [33, 18, 38, 15, 17, 36, 28, 50, 6], [58, 82, 108, 98, 46, 124, 90, 204, 13], [17, 24, 30, 28, 15, 34, 26, 51, 4], [19, 26, 32, 30, 17, 36, 28, 53, 6]]
>>> runeWay_add
[[112, 46, 134, 38, 46, 124, 90, 194, 13], [31, 16, 36, 13, 15, 34, 26, 48, 4], [33, 18, 38, 15, 17, 36, 28, 50, 6], [58, 82, 108, 98, 46, 124, 90, 204, 13], [17, 24, 30, 28, 15, 34, 26, 51, 4], [19, 26, 32, 30, 17, 36, 28, 53, 6]]
>>> import sys; print sys.version
2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2]
>>> runeWay_sub = []
>>> for SET in rune_keynumbers:
...   micro_array = []
...   for i in SET:
...     micro_array.append(0)
...   runeWay_sub.append(micro_array)
...
>>> runeWay_sub
[[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]
>>> for SET in enumerate(rune_keynumbers):
...   for i in enumerate(SET[1]):
...     runeWay_sub[SET[0]][i[0]] = rune_cynumbers[SET[0]][i[0]] - rune_keynumbers[SET[0]][i[0]]
... 
>>> runeWay_sub
[[-6, 0, 0, -24, -12, 18, -28, 0, -9], [-1, 0, 0, -7, -3, 4, -6, 0, -4], [-1, 0, 0, -7, -3, 4, -6, 0, -4], [48, -36, -26, 36, -12, 18, -28, 10, -9], [13, -8, -6, 8, -3, 4, -6, 3, -4], [13, -8, -6, 8, -3, 4, -6, 3, -4]]
用这两条线:

runeWay_add.append(micro_array)
runeWay_sub.append(micro_array)
Runway_add和Runway_sub是单独的列表,但您没有将micro_数组的内容复制到每个列表中;您正在每个数据库中存储对列表的引用。因此,当您执行

runeWay_sub[SET[0]][i[0]] = rune_cynumbers[SET[0]][i[0]] - rune_keynumbers[SET[0]][i[0]]
runeWay_add[SET[0]][i[0]] = rune_cynumbers[SET[0]][i[0]] + rune_keynumbers[SET[0]][i[0]]
表达式Runway_sub[SET[0]]和Runway_add[SET[0]]都引用同一个列表

下面是一个简单的示例,演示了完全相同的问题:

>>> c = [1,2,3]
>>> a = []
>>> b = []
>>> a.append(c)
>>> b.append(c)
>>> a[0][0] = 4
>>> a, b, c
([[4, 2, 3]], [[4, 2, 3]], [4, 2, 3])
c、 a[0]和b[0]都引用了完全相同的列表对象,因此对a[0][0]的赋值通过a、b和c可见。

在此之后:

>>> for SET in rune_keynumbers:
...   micro_array = []
...   for i in SET:
...     micro_array.append(0)
...   runeWay_add.append(micro_array)
...   runeWay_sub.append(micro_array)
Runway_add和Runway_sub包含相同的可变列表元素,因此对一个列表的元素所做的任何更改都将显示在另一个列表中。您可能希望将micro_阵列的副本附加到Runway_sub:


如您所见,Runway_add列表覆盖Runway_sub。此外,您可以看到,由于所有内容都是在解释器上键入的,所以没有输入错误。您的问题并不清楚。你能把它简化成一个更小、解释更好的例子吗?虽然我可能会猜测:Runway_sub和Runway_add是不同的列表,但它们包含的引用是相同的列表。你真的确定Runway_add和Runway_sub不引用相同的列表或相同的元素集吗?看起来你在两个列表中都添加了micro_数组,所以这是你所期望的行为。不,它们之间没有任何联系,我键入了你所看到的所有内容-除了符文键号和符文cynumbers的声明,这是非常不相关的@PaulGriffiths那么micro_阵列呢?该数组构造了两个列表是的,但是当我编辑这些列表中的列表时,这两个列表之间没有连接。
runeWay_sub.append(micro_array[:])