Странное поведение при создании новых объектов - PullRequest
0 голосов
/ 09 ноября 2018

Я новичок в 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 голосов
/ 09 ноября 2018

По сути, убедитесь, что вы назначаете новый список на 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.

0 голосов
/ 09 ноября 2018

Вы должны каждый раз передавать новый список в Vertex. Быстрый способ его создания - это понимание списка.

vertexCoords = [coordList[coords*n] for coords in range(n)]
vertices.append(vx.Vertex(vertexCoords))

Обратите внимание, вам не нужно (и не должно иметь) это объявление уровня класса coords; он затеняется переменной экземпляра, определенной в __init__.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...