在python中创建一个2d矩阵

Col*_*lin 19 python list

我创建了一个6x5 2d阵列,最初在每个单元格中只有None.然后,当我读取它时,我读取了一个文件并用数据替换了Nones.我首先创建空数组,因为我正在读取的文件中的数据是未定义的顺序.我第一次尝试这样做:

x = [[None]*5]*6
Run Code Online (Sandbox Code Playgroud)

这导致了一些我现在理解的奇怪错误,因为列表上的*运算符可能会创建引用而不是副本.

是否有一个简单的衬垫来创建这个空阵列?我可以做一些for循环并构建它,但对于python来说这似乎是不必要的冗长.

Vin*_*ard 32

使用嵌套的理解列表:

x = [[None for _ in range(5)] for _ in range(6)]
Run Code Online (Sandbox Code Playgroud)


aar*_*ing 20

这里发生的是这条线

x = [[None]*5]*6
Run Code Online (Sandbox Code Playgroud)

扩展到

x = [[None, None, None, None, None, None]]*6
Run Code Online (Sandbox Code Playgroud)

此时,您有一个列表,其中包含对单例的6个不同引用None.您还有一个列表,其中包含对内部列表的引用,因为它是第一个也是唯一的条目.当你将它乘以6时,你会得到5个对内部列表的引用.但重点是内部列表没有问题,只有外部列表没有问题所以没有必要将内部列表的构建扩展为理解.

x = [[None]*5 for _ in range(6)] 
Run Code Online (Sandbox Code Playgroud)

这样可以避免重复对任何列表的引用,并且简洁,因为它可以让我相信.