Python 索引数组填充不正确

Python 索引数组填充不正确,python,Python,我刚开始用Python编程,我有一个关于2D数组的问题。 我需要从av[1]中创建一个特定大小的矩阵(禁止使用numpy)并保存它,以便以后可以将其与另一个矩阵相乘。 对我来说,合乎逻辑的事情是: 1-获得av的长度[1];2-将av[1][]转换为与ord等效的ASCII,最后3-将该值插入一个名为key_matrix的列表中 矩阵需要是可能的最小尺寸,并且是“正方形”,因此我计算包含av[1]的len的最小正方形(称为矩阵_size),然后像这样初始化我的数组: key_matrix = [

我刚开始用Python编程,我有一个关于2D数组的问题。 我需要从av[1]中创建一个特定大小的矩阵(禁止使用numpy)并保存它,以便以后可以将其与另一个矩阵相乘。 对我来说,合乎逻辑的事情是: 1-获得av的长度[1];2-将av[1][]转换为与ord等效的ASCII,最后3-将该值插入一个名为key_matrix的列表中

矩阵需要是可能的最小尺寸,并且是“正方形”,因此我计算包含av[1]的len的最小正方形(称为矩阵_size),然后像这样初始化我的数组:

key_matrix = [[0] * matrix_size] * matrix_size; 
这样我的方阵就被0填满了。 例如,如果矩阵_size=3,我得到:

[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
现在奇怪的部分是(也是我被卡住的部分)下面,我使用

index1 = 0;
index2 = 0;
key_matrix[index1][index2] = ord(sys.argv[1][0]);
print(key_matrix);
仅填充第一行的第一个元素

而结果应该是:

[[97, 0, 0], [0, 0, 0], [0, 0, 0]]
我得到:

[[97, 0, 0], [97, 0, 0], [97, 0, 0]]
我和我的朋友们似乎真的不明白它为什么会这样做,欢迎任何帮助


感谢大家阅读:)

当您编写
[[0]*矩阵大小]*矩阵大小
时,列表的内存地址是相同的,它基本上将第一个
[0]*矩阵大小
数组的内存地址多次重复用作其他列表的相同引用。由于这些列表不是独立于内存地址的,所以我们只能修改其中一个列表。您可以执行以下操作以快速解决此问题:

>>> key_matrix2 = [[0] *3 for i in range(matrix_size)]
>>> key_matrix2
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> key_matrix2[0][1] = 2
>>> key_matrix2
[[0, 2, 0], [0, 0, 0], [0, 0, 0]]

的确如此,谢谢你!由于我还是个新手,我不知道要找什么,但这回答了我的许多问题,我只需要改变我声明密钥矩阵的方式;这是一个很常见也很容易理解的错误。