Python向for循环迭代中的每个项添加对象

Python向for循环迭代中的每个项添加对象,python,for-loop,Python,For Loop,几天前我开始学习python,它的功能和语法灵活性给我留下了深刻的印象,但今天我遇到了一个在其他编程语言中从未见过的奇怪错误,我想这是由于我对python的了解有限造成的,我将感谢对这种行为的任何帮助和解释 我有一个简单的for循环,在这个循环中,我迭代一系列节点,在每次迭代中,我将邻居添加到当前节点,但似乎它们不仅添加到当前节点,而且还添加到集合中的每个其他节点,因此,在最后,我没有使用最多8个邻居的节点,而是使用了最多8个邻居的节点(8*集合中的节点数)邻居,我不知道我错过了什么 def e

几天前我开始学习python,它的功能和语法灵活性给我留下了深刻的印象,但今天我遇到了一个在其他编程语言中从未见过的奇怪错误,我想这是由于我对python的了解有限造成的,我将感谢对这种行为的任何帮助和解释

我有一个简单的for循环,在这个循环中,我迭代一系列节点,在每次迭代中,我将邻居添加到当前节点,但似乎它们不仅添加到当前节点,而且还添加到集合中的每个其他节点,因此,在最后,我没有使用最多8个邻居的节点,而是使用了最多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)
编辑:

生成节点的节点类和代码如下:

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

您当前的代码正在将生成器表达式附加到
邻居
列表中。我很确定您希望附加的是实际节点,而不是生成器。此外,由于生成器是闭包(如果您不知道这意味着什么,请不要太担心),在决定附加哪些节点时,您可能计算错误

我建议进行第二个显式循环,而不是使用任何生成器表达式,并将生成器表达式中的所有
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)

我没有复制所有的条件,但您可以这样做,只需将它们与
连接即可。如果您想简化工作,您可以将一些条件分组(例如,您可以测试
n.x==node.x-1和node.y-1您当前的代码正在将生成器表达式附加到
邻居列表中。我很确定您希望附加的是实际节点,而不是生成器。此外,由于生成器是闭包(如果您不知道这意味着什么,请不要太担心),在决定附加哪些节点时,您可能计算错误

我建议进行第二个显式循环,而不是使用任何生成器表达式,并将生成器表达式中的所有
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)

我没有复制所有的条件,但您可以这样做,只需将它们与
连接即可。如果您想简化工作,您可以将一些条件分组(例如,您可以测试
n.x==node.x-1和node.y-1。您需要向我们展示如何创建
节点
,以便我们可以准确地向您展示如何修复它。但是发生的事情是,您没有创建一组单独的
节点
对象,而是创建了一个单独的对象,并且在
节点中有多个对该对象的引用ode>collection。有几种可能发生的方法谈到了最常见的方法。@PM2Ring:这个问题是我对原因的直接思考。还有经典的
some\u object\u copy=some\u object
谬论。你需要向我们展示你是如何创建
节点的,这样我们才能向你展示如何准确地修复它。但发生的是你没有创建一堆单独的
节点
对象,而是创建了一个单独的对象,并且在
节点
集合中有多个对该对象的引用。有几种可能发生的方法可以讨论最常见的方法。@PM2Ring:这个问题是我对原因的直接思考。还有经典的
一些对象opy=some_object
fallacy。或者您可以将生成器与
.extend
一起使用,但我个人也更喜欢嵌套循环。感谢您的回答,我稍后会尝试并给出反馈,或者您可以将生成器与
.extend
一起使用,但我个人也更喜欢嵌套循环。谢谢您的回答,我很高兴'我稍后会尝试并给出反馈