我是Python的初学者(大约一个月前开始是一个业余爱好),最近我开始从事4D +建模/可视化程序的工作(尽管听起来毫无意义,但这似乎很有趣)。因此,我开始研究一些非常基本的类/对象,并且在程序上定义超立方体时,我几乎立即遇到了一个问题:
import itertools as itt
import numpy as np
import Vertex as vx
def main():
defineHypercube(4)
def defineHypercube(n=4): #Creates an n-dimensional generalization of the cube
vertices = [] #List of the hypercube's vertices
coordList = list(itt.product([0, 1], repeat=n)) #Lists all the possible combinations with n bits (you probably already know though)
vertexCoords = [] #This list is here because it seemed like the easiest way to go about attributing coordinates to the vertices
for i in range(2**n): #An n-dimensional hypercube has 2^n vertices
for coords in range(n): #Each vertex is defined by n coordinates
vertexCoords.append(coordList[coords*n]) #Gets the x,y,z,w... coordinates for the new vertex
vertices.append(vx.Vertex(vertexCoords)) #Supposedly adds a new vertex with the coordinates from vertexCoords
vertexCoords.clear() #Well... it clears the list
print(list(vertices[i].coords)) #Used to check if I got it right
main()
import numpy as np
class Vertex:
coords = []
def __init__(self, coords):
self.coords = coords
"""def project():""" #This is here to remind me to get it done soon :')
那很好,一切都很好,我似乎看不到出什么问题了,但问题是我仍然得到了这个输出意外的输出,似乎表明在整个坐标分配过程中存在问题:>
Python的高手,请帮忙这个微不足道的初学者,这个初学者在这个问题上被困了一整天:v
答案 0 :(得分:0)
您应该每次将新列表传递给顶点。生成列表的一种快速方法是
。vertexCoords = [coordList[coords*n] for coords in range(n)]
vertices.append(vx.Vertex(vertexCoords))
请注意,您不需要(也不应该有)该类级别的coords
声明;它被__init__
中定义的实例变量所遮盖。
答案 1 :(得分:0)
基本上,请确保将新列表分配给vertexCoords
的次数与需要新列表的次数相同。您一次又一次地重用一个列表的原因就是造成您的错误的原因。
for i in range(2**n):
vertexCoords = []
for coords in range(n):
vertexCoords.append(coordList[coords*n])
vertices.append(vx.Vertex(vertexCoords))
不清除任何列表。第二行的赋值语句将在每次循环迭代中将vertexCoords
与新列表相关联,从而打破对旧列表的引用。旧列表不会丢失,因为您已经传递了对vx.Vertex()
的引用,该引用现在存储在coords
属性中。