【问题标题】:Error modifying one element in a Python list [duplicate]修改 Python 列表中的一个元素时出错 [重复]
【发布时间】:2018-02-16 13:21:59
【问题描述】:

我正在尝试更改 Python 列表中的元素。按照https://www.programiz.com/python-programming/matrix上的教程,我想出了下面的代码。

 matrix = [[0]*6]*3
 print(matrix)
 matrix[0][0] = 2
 print(matrix)

运行代码后,我收到以下输出:

[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
[[2, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0]]

注意输出的最后一行,每个子列表的第一个元素如何设置为2。我怎样才能做到只改变第一个列表的第一个元素。

【问题讨论】:

    标签: python list in-place


    【解决方案1】:

    这是一个经典的 Python gotcha,因为所有的 Python 对象都是引用。在您的情况下,这意味着 matrix[0] is matrix[1] is matrix[2] 因为 isTrue 如果两个对象在内存中是相同的东西。

    改为这样做

    matrix = [[0]*6 for _ in range(3)]
    

    现在matrix[0] is matrix[1] is matrix[2] 返回False

    或者,使用 numpy 来处理没有这些问题的数字数组。

    【讨论】:

    • 也感谢您的清晰解释,先生。祝你有美好的一天:D
    【解决方案2】:

    这是因为矩阵中的每一行都不是一个单独的数组,而是对同一个数组的引用。

    下面会打印出每一行的内存位置:

    for row in matrix:
        print(id(row))
    

    请注意,它们都是一样的。这是因为 python 中的列表是通过引用传递的,而不是复制每个单独的值。

    您在代码的第二部分中所做的基本上是:

    row = [0] * 6
    matrix = [row, row, row]
    

    这样你可能会更好:

    matrix = [[0 for _ in range(6)] for _ in range(3)]
    matrix[0][0] = 2
    [[2, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
    

    这会为您在矩阵中创建的每一行创建一个包含 0 的新数组。

    【讨论】:

      猜你喜欢
      • 2012-12-20
      • 2013-09-27
      • 2020-09-07
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      相关资源
      最近更新 更多