【问题标题】:difference between list and array(np)? [duplicate]列表和数组(np)之间的区别? [复制]
【发布时间】:2014-04-25 12:36:02
【问题描述】:

我正在尝试将 1 添加到 100*100 零矩阵中的某个特定位置。我的代码是这样的:

adjacency=[[0]*100]*100
while ...
    x=...
    y=...
    adjacency[x][y]=adjacency[x][y]+1

但它也增加了其他职位。表面上,adjacency[0]=adjacency[1]=..=adjacency[99],而while循环中x,y的计算是不可能产生这种结果的。

所以,我改为数组。我唯一改变的是:

adjacency=np.zeros((100,100))

这次结果是对的。 Adjacency[i] 不再相等。

有人知道为什么吗? (使用Python2.7。)

【问题讨论】:

    标签: python arrays list adjacency-matrix


    【解决方案1】:

    * 运算符并不总是用于创建列表,特别是多维列表。此运算符仅创建列表中元素的副本以填充更大的列表。这适用于原始类型,但不适用于其他对象。

    例如,当您编写 [0] * 100 时,它会创建一个包含 100 个元素的列表并将 0 分配给每个项目。现在您有了一个包含 100 个元素的列表的reference。因此,当您编写[[0] * 100] * 100] 时,您将获得列表[0] * 100 的100 个引用列表。因此,当您更改一个值时,它会影响所有“行”,因为所有行都引用同一个列表。

    这是一个较小的例子:

    >>> a = [0] * 3
    >>> print a
    [0, 0, 0]
    >>> b = [a] * 2
    >>> print b
    [[0, 0, 0], [0, 0, 0]]
    >>> a[0] = 1
    >>> print a
    [1, 0, 0]
    >>> print b
    [[1, 0, 0], [1, 0, 0]]
    >>> b[0][1] = 2
    >>> print b
    [[1, 2, 0], [1, 2, 0]]
    

    【讨论】:

    • 非常清楚,非常感谢!
    【解决方案2】:

    每次将第一行列表复制到其他 99 个位置。您需要为每一行创建一个新列表,如下所示:

    adjacency=[[0] * 100 for y in range(100)]
    

    【讨论】:

    • 非常感谢!完全理解!
    猜你喜欢
    • 2017-04-23
    • 2017-05-29
    • 1970-01-01
    • 2014-11-01
    • 2013-07-01
    • 1970-01-01
    • 2018-07-31
    • 2010-09-30
    • 2011-12-01
    相关资源
    最近更新 更多