Python добавляет объект к каждому элементу для итерации цикла - PullRequest
0 голосов
/ 25 августа 2018

Я начал изучать 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

1 Ответ

0 голосов
/ 25 августа 2018

Ваш текущий код добавляет выражение генератора в список neighbors.Я почти уверен, что вы хотите добавлять фактические узлы, а не генераторы.Кроме того, поскольку генераторы являются замыканиями (не беспокойтесь слишком сильно, если вы не знаете, что это значит), возможно, вы неправильно выполняете свои вычисления, когда решаете, какие узлы добавить.

I 'Я предлагаю сделать второй явный цикл вместо использования любых выражений-генераторов и превратить все предложения if, которые есть в выражениях-генераторах, в части условия в одном операторе if.Это будет выглядеть примерно так:

for node in nodes:
    for n in nodes:
        if (n.x == node.x - 1 and n.y == node.y or
            n.x == node.x + 1 and n.y == node.y or
            ...):
                 node.neighbours.append(n)

Я не копировал все условия, но вы можете сделать это, просто соединив их с or.Вы могли бы сгруппировать некоторые условия, если хотите упростить вещи (например, вы можете проверить n.x == node.x - 1 and node.y - 1 <= n.y <= node.y + 1 вместо трех разных тестов для различных значений y).

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