【问题标题】:Setting values in matrices - Python在矩阵中设置值 - Python
【发布时间】:2013-04-06 00:19:28
【问题描述】:

我将 i 矩阵设为 5x3

field = []
fields = []
    for i in range(0,5):
        for j in range(0,3):
            x = 1
            field.append(x)
    fields.append(field)

当我想改变一个字段时

fields[2][2] = 0

我明白了:

fields[0][0] = 1
fields[0][1] = 1
fields[0][2] = **0**
fields[1][0] = 1
fields[1][1] = 1
fields[1][2] = **0**
fields[2][0] = 1
fields[2][1] = 1
fields[2][2] = **0**
fields[3][0] = 1
fields[3][1] = 1
fields[3][2] = **0**
fields[4][0] = 1
fields[4][1] = 1
fields[4][2] = **0**

我得到了五个变化,而不是一个变化

【问题讨论】:

  • 我只想更改一个字段,我不知道为什么,但这样他总是更改 5 个字段(对于 fields[x][y],他更改的是整个 y 列而不是 xy 值)跨度>

标签: python arrays multidimensional-array matrix setting


【解决方案1】:

这是因为您在所有行中都引用了相同的 field

你想要这个:

for i in range(0,5):
    field = []
    for j in range(0,3):
        x = 1
        field.append(x)
    fields.append(field)

field 应该为每一行重置。这就是为什么你应该把它放在第一个循环中。现在你的fields[2][2] = 0 可以工作了。

>>> fields
[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]
>>> fields[2][2] = 0
>>> fields
[[1, 1, 1], [1, 1, 1], [1, 1, 0], [1, 1, 1], [1, 1, 1]]

【讨论】:

    【解决方案2】:

    发生这种情况的原因是列表的每一行都指向同一个对象,即名为field 的列表。您可以通过查看每一行的id 来了解这一点。你会发现:

    id(fields[0]) == id(fields[1])
    id(fields[0]) == id(fields[2])
    

    等等。每一行实际上都是同一个对象。

    您需要为每一行创建一个单独的列表:

    fields = []
    for i in range(0,5):
        field = []
        for j in range(0,3):
            x = 1
            field.append(x)
        fields.append(field)
    

    现在你会看到:

    id(fields[0]) != id(fields[1])
    

    等等。您修改单个元素的尝试将按照您的意图进行。

    但实际上,如果您想使用矩阵,那么您应该使用 numpy。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 2020-02-16
      • 2023-03-05
      • 2014-03-03
      相关资源
      最近更新 更多