【问题标题】:Create a Random Blank Matrix (2D array) in Python 3?在 Python 3 中创建一个随机空白矩阵(二维数组)?
【发布时间】:2014-09-21 05:44:51
【问题描述】:

我正在尝试在不使用 numpy 的情况下在 python 3 中创建一个随机空白矩阵。 代码看起来很完美,但是当我更改单个单元格的值(例如 Square1[0])时,它会更改所有 Square1[x] 值。

#!/usr/bin/env python3

# Creating a random n*n blank matrix
#for example 6*6

#I'll just create coloumns
def one():

    square = []
    for x in range(6):
        square.append(None)

    Square = []
    for x in range(6):
        Square.append(square)

    return Square

#output is exactly what i want
print(one())

#but when i try to change a single value(cell),

a = one()

a[2][2] = "Error"

#it's bullshit
print(a)

我或我的代码有什么问题?

【问题讨论】:

  • 试试这个:pastebin.com/DKsnEpNJ - 你期望输出什么?然后执行它。你猜对了输出吗?我很确定你没有。想想为什么输出不同。

标签: python python-3.x matrix multidimensional-array


【解决方案1】:

Square 是一个包含六个引用的列表,它们都指向同一个 square 列表。修改这些square 引用中的任何一个都会影响所有行。您可以通过查看行的 id 值来确认这一点:

a = one()
print id(a[0])
print id(a[1])

结果:

37725768
37725768

不要创建一个 square 并附加六次,而是创建六个 squares 并每个附加一次。

def one():
    Square = []
    for y in range(6):
        square = []
        for x in range(6):
            square.append(None)
        Square.append(square)
    return Square

现在这些行都将引用不同的列表。

a = one()
print id(a[0])
print id(a[1])
#result:
#37827976
#37829192

我还建议更改 square 的名称,因为有两个仅大小写不同的变量名称会很混乱。

def make_matrix():
    matrix = []
    for y in range(6):
        row = []
        for x in range(6):
            row.append(None)
        matrix.append(row)
    return matrix

【讨论】:

    【解决方案2】:

    您的代码失败,因为您将 6 个引用附加到同一个数组。有关更详细的解释,请参阅 Kevin 的回答。

    创建数组的更“pythonic”方式:

    array = [[None]*n for x in range(n)]
    

    这使用list comprehension

    【讨论】:

      猜你喜欢
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2020-02-17
      • 1970-01-01
      • 2021-10-04
      • 2011-02-11
      • 1970-01-01
      相关资源
      最近更新 更多