我正在编写一个将地图从一个角导航到另一个角的函数,该地图采用列表列表的形式,0为空格,1为墙。像这样:
[
[0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 1],
[0, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0]
]
我的代码用2标记了它所处的空格,这样它就不会退缩。代码会多次遍历地图,以尝试找到更短的路线,这意味着,每次遍历时,都必须重置地图。但是,似乎映射传递给的变量每次与映射一起的其他每个变量都发生变化时,因此我无法保留原始副本。这似乎只有在传递给函数而不是在函数中设置时才会发生。我尝试了几种不同的方法,例如设置多个其他变量,通过将变量附加在for循环中来传递每个列表,清除其中一个变量,但是我似乎找不到问题,我从未遇到过之前有种问题,我很困惑。有什么想法吗?
答案 0 :(得分:0)
您可以发布一些代码吗?
与其直接将原始地图传递给正在浏览地图的功能,不如将其传递给地图。只需复制地图并将其存储在另一个变量中即可。将此新变量传递给正在浏览地图的函数。
答案 1 :(得分:0)
似乎您正在将地图(列表的列表)传递给函数,并且感到惊讶的是,该函数更改了传递给它的原始地图。但是,在许多列表操作下,这是预期的行为。
潜在的问题是Python lists are mutable.,这意味着a[i] = b
之类的操作将就地修改列表。
请考虑以下示例:
a_list = [1, 2, 3]
def foo(l):
l[0] += 1
return l
b_list = foo(a_list)
在这里,我们发现
>>> b_list
[2, 2, 3]
>>> a_list
[2, 2, 3]
>>> a_list is b_list
True
如果要防止这种情况,则必须先创建列表的副本,然后再对其进行修改:
import copy
def foo_2(l):
# this creates a copy of the list and all sublists
l = copy.deepcopy(l)
l[0] += 1
return l
b_list = foo_2(a_list)
现在,我们发现以下内容:
>>> b_list
[2, 2, 3]
>>> a_list
[1, 2, 3]
>>> a_list is b_list
False
您可以在传递地图之前对地图进行相同的操作,或者要更加小心,避免对数据进行就地操作。