x = 0
y = []
for i in range (5):
y.append(x)
x+=1
print y
给出:
[0, 1, 2, 3, 4]
但是,
x = range (2)
y = []
for i in range (5):
y.append(x)
x[0]+=1
print y
我会想(希望)这给了我:
[[0, 1], [1, 1], [2, 1], [3, 1], [4, 1]]
但它只是给了我:
[[5, 1], [5, 1], [5, 1], [5, 1], [5, 1]]
我通过在for循环中放置'print y'来测试它,显然正在发生的是当x [0] + = 1时,所有已经在'y'内的'x'正在更新新的价值。
如何编写程序以便'忘记''已经在列表中的'y'仍然是变量(因此不会继续更新它们)?
我意识到我可以专门写这个:
y = []
for i in range (5):
x = [i, 1]
y.append(x)
但是如果我想在for循环之外定义x呢?我想不出我想这样做的时候,但我还是想知道。
答案 0 :(得分:2)
如果在for循环外定义x
,则每次都是对同一列表的引用。如果希望每个子列表都是独立的,则必须在循环内创建它。你的最终代码块有效。
然而,更简洁和pythonic的做法是list comprehension:
y = [[i, 1] for i in range(5)]
答案 1 :(得分:2)
@tzaman提供了完美的解决方案,但您需要自己的代码:
x = range (2)
y = []
for i in range (5):
y.append(x[:]) #You should append copy of x
x[0]+=1
print y
给出:
[[0, 1], [1, 1], [2, 1], [3, 1], [4, 1]]