List.append() 将所有元素更改为附加项[重复]
Posted
技术标签:
【中文标题】List.append() 将所有元素更改为附加项[重复]【英文标题】:List.append() changing all elements to the appended item [duplicate] 【发布时间】:2011-07-13 22:34:43 【问题描述】:我的用 Python 制作的迷宫生成程序似乎有问题。我正在尝试随机创建一条在选定点处分支的路径,这些点会随着它的进行而存储。当迷宫到达死胡同时,它将通过测试最高值而不是弹出该值并进入下一个,对访问过的点进行排序,直到它到达一个不是死胡同的地方。但是,当我尝试将项目附加到我用来保存我去过的空间的列表中时,会发生一些奇怪的事情,我以前从未见过它。这是代码,查看它的最佳方法是运行它,直到它一直运行。我还没有真正找到解决死胡同问题的方法,所以如果有人也能帮助我解决这个问题,那就太好了。
import random
width = 8
def check(x,y):
"""Figures out the directions that Gen can move while"""
if x-1 == -1:
maze[x][y][3] = 0
if x+1 == 8:
maze[x][y][1] = 0
if y+1 == 8:
maze[x][y][2] = 0
if y-1 == -1:
maze[x][y][0] = 0
if x + 1 in range(0,8) and visited[x+1][y] == False:
maze[x][y][1] = 2
if x - 1 in range(0,8) and visited[x-1][y] == False:
maze[x][y][3] = 2
if y + 1 in range(0,8) and visited[x][y+1] == False:
maze[x][y][2] = 2
if y - 1 in range(0,8) and visited[x][y-1] == False:
maze[x][y][0] = 2
def Gen(x,y):
visited[x][y] = True
past.append(current)
dirs = []
check(x,y)
print current
if maze[x][y][0] == 2:
dirs.append(0)
if maze[x][y][1] == 2:
dirs.append(1)
if maze[x][y][2] == 2:
dirs.append(2)
if maze[x][y][3] == 2:
dirs.append(3)
pos = random.choice(dirs)
print dirs
maze[x][y][pos] = 1
if pos == 0:
current[1] -= 1
if pos == 1:
current[0] += 1
if pos == 2:
current[1] += 1
if pos == 3:
current[0] -= 1
if maze[x][y][0] == 4:
maze[x][y][0] = 1
if maze[x][y][1] == 4:
maze[x][y][1] = 1
if maze[x][y][2] == 4:
maze[x][y][2] = 1
if maze[x][y][3] == 4:
maze[x][y][3] = 1
print maze[x][y]
print past, '\n'
#Build the initial values for the maze to be replaced later
maze = []
current = [0,0]
visited = []
past = []
#Generate empty 2d list with a value for each of the xy coordinates
for i in range(0,width):
maze.append([])
for q in range(0, width):
maze[i].append([])
for n in range(0, 4):
maze[i][q].append(4)
#Makes a list of falses for all the non visited places
for x in range(0, width):
visited.append([])
for y in range(0, width):
visited[x].append(False)
#Generates the walls
#for q in range(0, width):
# for i in range(0, width):
# check(q, i)
current = [0,0]
while current != [7,7]:
Gen(current[0], current[1])
print maze
如您所见,它从 0,0 开始,然后计算出可能的路径。它从这些中随机选择并将房间那一侧的值设置为 0,0 到 1,这意味着通道。 2 表示墙,0 表示出界。 4 只是一个占位符,因为所有值都应在迷宫完全生成时填充。
如果有人可以帮助我,那将非常好,非常感谢。提前致谢。
【问题讨论】:
您在使用 list.append() 时看到的奇怪行为是什么?预期的结果是什么?实际结果如何? 列表中的每个元素都变成新添加的元素。比如迷宫4个方格后,过去的4个元素就变成了附加元素是什么。我期待的是,它将是生成器所采用路径的列表,例如 [[0,0][0,1][1,1][2,1]] 等。跨度> 好的,所以当前(错误)行为是,例如,如果您有[[0,0],[0,0],[0,0]]
并附加了[1,2]
,那么列表将变为:[[1,2],[1,2],[1,2],[1,2]]
?
【参考方案1】:
我相信current
列表只是被多次复制到past
中。所以你有 same 列表的多个副本。
修复:在past.append(current)
行(def Gen(x,y):
下两行)中,将其更改为past.append(current[:])
。
符号list[:]
创建列表的副本。从技术上讲,您正在创建整个列表的一部分。
顺便说一句,更好的解决方案是不使用全局current
变量:)
【讨论】:
这行得通,但你能告诉我为什么吗?我不知道为什么简单的附加不起作用。 好的,您有一个名为current
的两元素列表。当您将其附加到past
时,您插入了对它的引用。所以,现在current
和past[-1]
都引用了 same 对象。然后,再次附加它,所有:past[-2]
、past[-1]
和 current
都指向 same 对象。因此,当您编辑current
时,列表中的项目也会发生变化。因为所有都引用了 same 对象...换句话说,使用past.append(current)
确实not 会复制current
。
没问题。我很高兴能帮上忙。
或使用 Python 列表的copy()
方法获取深拷贝:past.append(current.copy())
【参考方案2】:
是的,这是正确的,而 Python 中的 List Comprehension 您需要通过 strip 附加,否则它将替换多次
【讨论】:
请更正你的语法,这样答案就清楚了。以上是关于List.append() 将所有元素更改为附加项[重复]的主要内容,如果未能解决你的问题,请参考以下文章