在我的项目中,我有一个稍微困难的代码和平,但它的行为与这个代码完全相同:
seq = []
a = []
for i in range(3):
a[:] = []
a.append(i)
a.append(i)
seq.append(a)
print seq
它作为输出:
[[0, 0]]
[[1, 1], [1, 1]]
[[2, 2], [2, 2], [2, 2]]
虽然我希望它是:
[[0, 0]]
[[0, 0], [1, 1]]
[[0, 0], [1, 1], [2, 2]]
我做错了什么?
答案 0 :(得分:1)
在循环内移动a
的初始化,目前您一次又一次地将同一个列表对象追加到seq
:
for i in range(3):
a = [] #or simply a = [i] * 2
a.append(i)
a.append(i)
seq.append(a)
print seq
如果您在程序结束时打印seq
项目的id()项,您将获得相同的ID()。所以,所有这些都是对同一个列表对象的引用:
print [id(x) for x in seq]
#[1095704328L, 1095704328L, 1095704328L]
In [106]: a = []
In [107]: seq = [a, a, a]
In [108]: a.append(1)
In [109]: seq
Out[109]: [[1], [1], [1]]
In [110]: a.append(2)
In [111]: seq
Out[111]: [[1, 2], [1, 2], [1, 2]]
答案 1 :(得分:1)
请尝试以下代码:
seq = []
a = []
for i in range(3):
a = []
a.append(i)
a.append(i)
seq.append(a)
print seq
运行如下:
>>> a = []
>>> seq = []
>>> for i in range(3):
... a = []
... a.append(i)
... a.append(i)
... seq.append(a)
... print seq
...
[[0, 0]]
[[0, 0], [1, 1]]
[[0, 0], [1, 1], [2, 2]]
>>>
您的问题是,即使您添加了不同的值,但在更改a
后,seq
中的值也会发生变化。