Python嵌套for循环返回错误结果(?)

时间:2013-12-03 17:03:37

标签: python for-loop nested

我对这段代码有疑问:

def new_field():
    global field
    field= [[]]*9
    for x in range(9):
        for y in range(1,10):
            field[x].append([y," "])
    return field

我理解for循环的方式,它应该返回一个这样的列表: [[[1,“”],[2,“”],[3,“”],...... [9,“”],[1,“”],[2,“”],..

这意味着对于从0到8的每个索引,该字段应该具有9的长度 - >

len(field[0])应为9.而不是每个索引的长度为81,应该是每个子列表中可以找到整个列表。

看起来像这样:

[[[1, ' '], [1, ' '], [1, ' '], [1, ' '], [1, ' '], [1, ' '], [1, ' '], [1, ' '], [1, ' '], [2, ' '], [2, ' '], [2, ' '], [2, ' '], [2, ' '], [2, ' '], [2, ' '], [2, ' '], [2, ' '], [3, ' '], [3, ' '], [3, ' '], [3, ' '], [3, ' '], [3, ' '], .......

现在我有一种感觉,我根本不明白for循环是如何工作的,但我只是不知道我缺少的东西或者我的思维过程中的问题所在。

希望有人可以提供帮助!

2 个答案:

答案 0 :(得分:4)

  

我理解for循环的方式......

是的,但你误解了参考文献。

>>> a = b = []
>>> a.append(1)
>>> b
[1]

您需要每次都创建新的子列表。

field = [[] for x in range(9)]

答案 1 :(得分:2)

你的问题在于这一行:

field= [[]]*9

相反,它需要像这样:

field= [[] for _ in range(9)]

这是因为当前代码正在创建一个包含相同列表的9个副本的列表。

以下是演示:

>>> x = [[]]*2
>>> x
[[], []]
>>> id(x[0]) == id(x[1]) # The lists have the same id, so they are the same
True
>>> x = [[] for _ in range(2)]
>>> x
[[], []]
>>> id(x[0]) == id(x[1]) # The lists have different ids, so they are different
False
>>>