Python 在函数中生成网格

Python 在函数中生成网格,python,Python,在计算机科学课上,我们制作了一个小脚本,用于通过节点网格寻找最短路径,有些是相互关联的,有些不是。 griddata以一种不需要定义任何新类的方式存储,即在嵌套列表中。对于n个节点,列表应该有n个元素,每个元素都是一个包含n个元素的列表 网格[a][b]应返回从节点a到节点b的距离,如果节点未连接或a和b引用同一节点,则返回0 例如,列表[[0,2,2],[2,0,2],[2,2,0]]将定义一个具有3个节点的网格,每个节点之间的距离为2 下面是我编写的脚本,它应该通过请求用户的单独距离来定义这

在计算机科学课上,我们制作了一个小脚本,用于通过节点网格寻找最短路径,有些是相互关联的,有些不是。 griddata以一种不需要定义任何新类的方式存储,即在嵌套列表中。对于n个节点,列表应该有n个元素,每个元素都是一个包含n个元素的列表

网格[a][b]
应返回从节点a到节点b的距离,如果节点未连接或a和b引用同一节点,则返回0

例如,列表
[[0,2,2],[2,0,2],[2,2,0]]
将定义一个具有3个节点的网格,每个节点之间的距离为2

下面是我编写的脚本,它应该通过请求用户的单独距离来定义这样一个网格:

def makegrid(nodes):
    res=[[0]*nodes]*nodes
    for i in range(nodes):
        for j in range(nodes):
            if res[i][j]==0 and not i==j:
                x=raw_input('distance node %d zu node %d: ' % (i,j))
                if x:
                    res[i][j]=res[j][i]=int(x)
                else:
                    res[i][j]=res[j][i]=None
    for i in range(nodes):
        for j in range(nodes):
            if res[i][j] is None:
                res[i][j]=0
    return res
我的问题是,这个函数并没有达到我想要的效果,我似乎不知道为什么。它实际上只运行第一个节点的请求,并且以某种方式对所有子列表执行它只应对第一个节点执行的操作(并且忽略不应更改第一个元素)

有人能帮我弄清楚吗

 res=[[0]*nodes]*nodes
可能不会像你认为的那样:

>>> nodes = 3
>>> res=[[0]*nodes]*nodes
>>> res
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> res[0][0] = 'echo'
>>> res
[['echo', 0, 0], ['echo', 0, 0], ['echo', 0, 0]]
它不是创建三个单独的列表[0,0,0],而是为同一列表提供三个引用:

>>> id(res[0]), id(res[1]), id(res[2])
(4299671960, 4299671960, 4299671960)
试一试


相反,阅读,例如,为了理解为什么整数和列表的可变性差异解释了[0]*节点部分的行为似乎与您预期的一样——即,为什么上面的答案有['echo',0,0]的多个副本,而不是['echo',echo',echo']——即使最后的“*节点”没有

我也上了那个圈套。列表乘法并没有达到您期望的效果。看看这个

改为使用列表理解的简单解决方法:

# res=[[0]*nodes]*nodes
res = [[0 for j in range(nodes)] for i in range(nodes)]
# res=[[0]*nodes]*nodes
res = [[0 for j in range(nodes)] for i in range(nodes)]