实例化新对象时的奇怪行为

时间:2018-11-09 13:21:04

标签: python python-3.x list object

我是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 :')

那很好,一切都很好,我似乎看不到出什么问题了,但问题是我仍然得到了这个输出意外的输出,似乎表明在整个坐标分配过程中存在问题:

output

Python的高手,请帮忙这个微不足道的初学者,这个初学者在这个问题上被困了一整天:v

2 个答案:

答案 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属性中。