Я начал изучать python несколько дней назад, и на самом деле я очень впечатлен его возможностями и гибкостью синтаксиса, но сегодня я столкнулся со странной ошибкой, которую я никогда не видел в других языках программирования, я полагаю, что это из-за моего ограниченного знания Python, я буду признателен за любую помощь и объяснение такого поведения.
У меня есть простой цикл for, в котором я перебираю список узлов, в каждой итерации я добавляю соседей к текущему узлу, но кажется, что они добавляются не только к текущему узлу, но и ко всем остальным узлам в коллекции таким образом, в конце, вместо того, чтобы иметь узлы с максимум 8 соседями, я получаю узлы с соседями (8 * количество узлов в коллекции), я понятия не имею, что я здесь пропустил.
def evaluate_neighbours(nodes):
for node in nodes:
node.neighbours.append(n for n in nodes if n.x == node.x - 1 and n.y == node.y)
node.neighbours.append(n for n in nodes if n.x == node.x + 1 and n.y == node.y)
node.neighbours.append(n for n in nodes if n.y == node.y - 1 and n.x == node.x)
node.neighbours.append(n for n in nodes if n.y == node.y + 1 and n.x == node.x)
node.neighbours.append(n for n in nodes if n.y == node.y + 1 and n.x == node.x + 1)
node.neighbours.append(n for n in nodes if n.y == node.y + 1 and n.x == node.x - 1)
node.neighbours.append(n for n in nodes if n.x == node.x - 1 and n.y == node.y + 1)
node.neighbours.append(n for n in nodes if n.x == node.x + 1 and n.y == node.y - 1)
EDIT:
Класс узла и код, генерирующий узлы, следующие:
class Node:
x = 0
y = 0
neighbours = []
alive = False
def __init__(self, _x, _y, _alive):
self.x = _x
self.y = _y
self.alive = _alive
def generate_grid(data):
nodes = []
for index_y, y in enumerate(data):
for index_x, x in enumerate(y):
if x == "X":
nodes.append(Node(index_x, index_y, True))
else:
nodes.append(Node(index_x, index_y, False))
return nodes