Python正在覆盖我的列表

时间:2013-12-13 21:30:07

标签: python list overwrite

我最近尝试使用Python。我建立了一个第四维数组;前三个维度定义世界空间中的位置,第四个维度定义可能属于该空间的节点。节点是我所做的预定义类。 首先,列表中的每个条目都设置为None,稍后我会根据需要添加值。我的问题是,每当我添加这些值时,它似乎会覆盖每个条目,使其等于包含的最后一个条目。 以下是调用模块的相关摘录:

import Node
myList = [[] for i in range(4)]
xDim = yDim = zDim = 0
def main():
   return 1

def setDimensions(x, y, z):
   global myList, xDim, yDim, zDim
   xDim = x
   yDim = y
   zDim = z
   myList = [ [ [ [ None for i in range(12)] for j in range(z) ] for k in range(y) ] for l in range(x) ]

def process(x, y, z, data):
   global myList
   for i in range(12):
       a = int(data[i])
       if a != 0:
           myList[x][y][z][i] = Node.Node()
           myList[x][y][z][i].setType(a, i, x, y, z)   
   print(myList[0][0][0][3].getX(), myList[0][0][0][3].getY(), myList[0][0][0][3].getZ()) 

以下是Node类的摘录,包含在Node.py模块中:

Type = xCoord = yCoord = zCoord = 0
class Node():
def main():
    return 1
def getX(self):
    global xCoord
    return xCoord

def getY(self):
    global yCoord
    return yCoord

def getZ(self):
    global zCoord
    return zCoord    

def setType(self, color, i, x, y, z):
    global xCoord, yCoord, zCoord
    xCoord = x
    yCoord = y
    zCoord = z

当我在处理方法结束时运行print时,我希望每次都看到0,0,0。相反,我看到了:

0 0 0

0 0 1

0 0 2

3 3 3

进一步的测试已经证实,每次我创建一个新节点并将其添加到我的列表中时,它似乎不仅会占据列表中我想要的位置,而且还会覆盖每个以前的列表条目。我错过了什么?

1 个答案:

答案 0 :(得分:5)

问题与您的列表无关,您似乎正确地执行了这些操作 - 您有大量单独的Node个实例。

问题是Node使用全局变量而不是属性,因此所有这些单独的Node实例将从node.getX()返回完全相同的东西 - 全局变量的值{ {1}}。

解决方案就是不这样做:

xCoord

然而,值得注意的是,几乎从来没有一个很好的理由在Python中使用这样的“getter and setter”方法。只需编写访问class Node(): def __init__(self): self.xCoord, self.yCoord, self.zCoord = 0, 0, 0 def main(): return 1 def getX(self): return self.xCoord def getY(self): return self.yCoord def getZ(self): return self.zCoord def setType(self, color, i, x, y, z): self.xCoord = x self.yCoord = y self.zCoord = z 而不是node.xCoord的代码,就可以完全消除这些方法。