Python中的多个2D列表混淆

时间:2015-11-15 22:13:19

标签: python

我试图创建一个可以在文本控制台中设置动画的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,但我找不到。

感谢您的帮助。

3 个答案:

答案 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

如果你想制作副本,有几种选择:

  • 只需创建一个新鲜的对象。将创建空白版本的一对循环放入函数中并调用它两次。
  • 检查deep copying的答案。对于您的数据结构copy.deepcopy将起作用。

答案 2 :(得分:0)

在python中,当你这样做:

blankMap = globalMap

blankMap和globalMap都引用相同的数据。你真正想要的是一个“副本”:

from copy import deepcopy

...

blankMap = deepcopy(globalMap)

了解更多信息,请查看“deepcopy”。