我创建了一个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)
这样可以避免重复对任何列表的引用,并且简洁,因为它可以让我相信.