python - 在 Python 中构建二维数组

标签 python arrays multidimensional-array

<分区>

我在 Python 中构建了一个二维向量,因为一开始我希望它全为零,并且不想使用 numpy,所以我尝试了这个:

columns = 8
rows = 5
m = [[0]* (columns)] * (rows)
m[3][2] = 1
print m

我得到了一个意想不到的行为:

>> [[0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0]]

它看起来像这样构建二维数组,使每一行成为对单个行的引用,因此如果写入其中任何一个,你就是在覆盖所有这些。

也许这对你们中的一些人来说听起来很明显,但我有点震惊。当然,我可以使用不同的方法修复它,但我很好奇为什么会这样。

谁能解释一下?如果您使用 [0] * size_of_array 构建一个简单数组,为什么这不会发生?

最佳答案

这是一个常见的 Python gothca。您不是在创建 rows 内部列表,而是在创建对同一列表的 rows 引用。

您的代码等同于以下内容:

inner_list = [0] * columns
m = [inner_list] * rows

我建议在不使用 * 运算符的情况下构建行。 (您不会遇到列的问题,因为 0 是一个 int 而 int 是不可变对象(immutable对象)。)

matrix = []
for row in rows:
    matrix.append([0] * columns)

关于python - 在 Python 中构建二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17452461/

相关文章:

python - Matplotlib:缩放后找出 xlim 和 ylim

java - java中的二维数组用于遍历行

c - 使用scanf填充多维数组(C语言)

python - 是否可以使用 Pool.map() 让多个进程写入同一个字典?

python - 在 Keras 功能 API 中合并两个模型

java - 读取文本文件并添加到列表时出现内存不足错误

java - 如何将两个数组合并成各自的二维数组?

php - 如何更改 PHP 中特定关联数组的值?

python - 如何处理返回 NSError 的 PyObjC 方法?

javascript - 如何使用函数将数组添加到参数?