我正在编写代码,使用嵌套列表作为网格系统,但遇到了一些问题。下面是我正在使用的代码:
N = int(input(""))
Yard = \[\]
Yardhelper = \[\]
for n in range(0,N):
Yardhelper.append("")
for n in range(0,N):
Yard.append(Yardhelper)
for n in range(0,int(input(""))):
treepos = \[int(x) for x in input().split(" ")\]
Yard\[treepos\[0\]\] \[treepos\[1\]\] = 1
print(Yard)
输入格式为
第1行:码的大小
第2行:树数
第3+行:树的坐标(输入应为“x y”(无引号)
你自己试试,我想不通。
我四处查看了一下,发现我可以访问列表并读取它们的值,很好,这只是写入值。假设我给予3,然后在下一行输入一棵树,所以我输入1,然后在下一行输入坐标:0 1.它应该给予结果
[[0, 1, 0], [0, 0, 0], [0, 0, 0]]
而是打印
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
我不知道为什么会发生这种情况,我的朋友也不知道,他们在编程方面比我好一点。他们都说我的代码看起来很好,并感到困惑
1条答案
按热度按时间nkoocmlb1#
您的代码的问题是,您将对列表'Yardhelper'的引用放到了第二个for循环中的列表'Yard'中。
你要做的是在另一个列表中创建同样大小的列表,但是你这样做的方式是在列表"Yard"中添加对列表"Yardhelper"的引用,而不是添加值。
解决这个问题的一个简单方法是不要使用另一个列表来生成多维列表,因为列表不是通过值传递而是通过引用传递,换句话说,当你在第二个for循环中追加列表'Yardhelper'时,你没有复制它,而是在列表'Yard'的所有索引上给出列表'Yardhelper'的地址。列表'Yard'的所有元素都是同一个,如果你改变列表"Yardhelper"的任何元素,列表"Yard"的所有其他元素也会改变。
当你想把你的列表传递给某个函数时,这个行为是很有用的,这样这个函数就可以改变这个列表的值,但是在你的例子中,你只是在不同的索引上引用同一个元素。
下面是如何创建一个二维列表而不引用其他列表代码
这个输入代码
5
3
10个
第0个,共1个
二、三
导致
[[1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1]