【问题标题】:Python: Basic operation of a list of listsPython:列表列表的基本操作
【发布时间】:2020-11-21 05:26:36
【问题描述】:

我承认我对列表的行为方式感到困惑,并且我已经编写了许多示例程序并倾注了文档问题,但无法弄清楚。

我正在考虑将多达 40 种选择中的四种选择组合成独特的组合(从数学的角度来看)。在运行时,我读入了一个选项列表(每次运行都会更改),并且需要构建一个 X 乘 X 的表(使用列表列表),其中 X = 选项数。我需要实时构建我的列表列表,以初始值 0 加载每个列表中的每个位置,然后继续。

我首先构建一个长度合适的空白列表并用 0 加载它。然后我根据需要多次将该空白列表附加到我的分数列表中。所以现在理论上我有一个列表,其中包含 28 个列表的出现,该列表在 28 个位置中的每个位置都有一个 0。

如果我尝试在大列表(例如位置 [2][2])中的一个位置(一列,一行)更改一个值,为什么会在每个成员中更改位置 2?名单。关于列表的行为方式,我缺少一些非常基本的东西。

感谢您的帮助。


blank = []
counter = 0
while counter < 28:
    blank.insert(counter,0)
    counter +=1

print("Blank = ", blank)
scores = []
counter = 0
while counter < 28:
    scores.append(blank)
    counter +=1

print("Array built", scores)

scores[2][2] = 2

print("array changed", scores)one position in one row

【问题讨论】:

    标签: python list multidimensional-array


    【解决方案1】:

    你会看到这段代码:

    while counter < 28:
        scores.append(blank)
        counter +=1
    

    您正在添加相同的列表blank 28 次。所有这 28 个列表都是同一个。
    从逻辑上讲,如果您执行scores[2][2] = 2,它将更改列表编号 3 和列编号 3,但由于它在任何地方都是相同的列表,因此它们都会“更改”。

    您需要做的是创建 28 个不同的列表,这样它才能正常工作。

    【讨论】:

      【解决方案2】:

      这是因为您将 blank 列表附加到 score 列表中。 score 列表实际上指向空白列表的引用。如果您注意到了,空白列表也会发生变化。

      试试这个

      scores=[[0,0,0,0],[0,0,0,0],[0,0,0,0]]
      scores[2][2]=2
      

      【讨论】:

        【解决方案3】:

        使用这段代码:

        while counter < 28:
            scores.append(blank.copy())
            counter +=1
        

        当您编写scores.append(blank) 时,它会添加相同的列表(在内存中)28 次,因此更改一个实例将更改所有实例,因为所有实例都指向相同的内存空间。 .copy() 允许您附加列表的副本。每个都有不同的内存引用。

        我们在使用 .copy() 运行您的代码时得到此输出(将 28 替换为 5):

        array changed [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 2, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
        

        【讨论】:

        • 谢谢 - 复制版效果很好。不知道我是如何误读文档 (docs.python.org/3/tutorial/datastructures.html) - 它确实似乎说将结束项目附加到列表的末尾,但我真正想要的只是理解并继续。非常感谢大家。
        【解决方案4】:

        @Haytam 和@AnantKumar 的回答关于为什么所有列表都被更改是正确的;所有列表都具有相同的引用,可以通过在每次迭代中运行 id(blank) 来查看。

        这样的事情怎么样:

        import numpy as np
        
        scores = np.repeat(0, 28**2).reshape(28, 28)
        

        这将创建一个由 28 个数组组成的 ndarray,所有这些数组都用 28 个零填充,其中的特定值可以更改,就像您尝试做的那样。

        验证:

        变化可以验证为:

        scores[2][2] = 2
        sum(sum(scores))
        >>> 2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-01
          • 1970-01-01
          • 2013-04-14
          • 2013-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-03
          相关资源
          最近更新 更多