我试图创建一个可以在文本控制台中设置动画的python程序,但是我遇到这个问题,其中一个列表应该保持空白而另一个列表显示并且可以更改。但是,如果您运行下面的代码,您可以看到我遇到的问题。
import os, time
os.system("clear") #clear screen, if on windows replace with "cls"
globalMap = []
width, height = 10, 10 #width of the map
for x in range(width):
globalMap.append([])
for y in range(height):
globalMap[x].append("0")
blankMap = globalMap
#create two blank 2D lists of width*height (10*10)
def output(interface):
for x in interface:
for y in x:
print(y, end=" ")
print("")
#output the argument in a grid, argument must be a 2D list
playerX, playerY = 0, 0
while True: #game loop
globalMap[playerY][playerX] = "■" #write player position to globalMap
output(globalMap) #Display the globalMap as a grid
print("-"*20)
output(blankMap) #Display the blank map
time.sleep(1)
os.system("clear")
playerX += 1
在底部输出的网格应保持空白,而在顶部输出的网格应该具有向右动画的正方形试验。我知道某处blankMap
被设置为globalMap
,但我找不到。
感谢您的帮助。
答案 0 :(得分:0)
blankMap = globalMap
此行不会复制globalMap
,但会为内存中的同一位置创建别名。
使用[:]
blankMap = globalMap[:]
请参阅:visualization on PythonTutor.com
编辑:使用copy.deepcopy
复制多维列表
import copy
blankMap = copy.deepcopy(globalMap)
答案 1 :(得分:0)
在python中,列表是对象,当你执行赋值时,左侧将指向右侧:
l1=[]
l2=l1
l1.append(1)
l2 # [1]
id(l1) == id(l2) # True
如果你想制作副本,有几种选择:
copy.deepcopy
将起作用。答案 2 :(得分:0)
在python中,当你这样做:
blankMap = globalMap
blankMap和globalMap都引用相同的数据。你真正想要的是一个“副本”:
from copy import deepcopy
...
blankMap = deepcopy(globalMap)
了解更多信息,请查看“deepcopy”。