我最近尝试使用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
进一步的测试已经证实,每次我创建一个新节点并将其添加到我的列表中时,它似乎不仅会占据列表中我想要的位置,而且还会覆盖每个以前的列表条目。我错过了什么?
答案 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
的代码,就可以完全消除这些方法。