我对这段代码有疑问:
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循环是如何工作的,但我只是不知道我缺少的东西或者我的思维过程中的问题所在。
希望有人可以提供帮助!
答案 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
>>>