【问题标题】:generating a grid in a function在函数中生成网格
【发布时间】:2011-07-21 02:47:09
【问题描述】:

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

grid[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

我的问题是该功能并没有完全按照我的意图去做,而且我似乎无法找出原因。它实际上所做的只是运行对第一个节点的请求,并且以某种方式对所有子列表执行它应该只对第一个节点执行的操作(并且忽略不应该更改第一个元素)。

谁能帮我弄清楚?

【问题讨论】:

    标签: python


    【解决方案1】:
     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)
    

    试试

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

    相反,阅读Multiply operator applied to list(data structure) 以了解为什么整数和列表的可变性差异解释了为什么 [0]*nodes 部分的行为看起来像您期望的那样——即为什么上面的答案有多个['echo', 0, 0] 的副本,而不是 ['echo', 'echo', 'echo'] - 即使最终的“*nodes”没有。

    【讨论】:

      【解决方案2】:

      我也中了那个陷阱。列表乘法不会按照您的预期进行。看看这个thread

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多