我创建了一个6x5的二维数组,最初每个单元格都只有None。然后我读取一个文件并在读取数据时将Nones替换为数据。 我首先创建空数组,因为我正在读取的文件中数据顺序未定义。我的第一次尝试是这样的:
x = [[None]*5]*6
由此产生了一些奇怪的错误,现在我理解是因为在列表上使用 * 运算符可能会创建引用而不是副本。
有没有一种简单的一行代码来创建这个空数组?我可以使用一些for循环来构建它,但是这似乎对Python来说太啰嗦了。
我创建了一个6x5的二维数组,最初每个单元格都只有None。然后我读取一个文件并在读取数据时将Nones替换为数据。 我首先创建空数组,因为我正在读取的文件中数据顺序未定义。我的第一次尝试是这样的:
x = [[None]*5]*6
由此产生了一些奇怪的错误,现在我理解是因为在列表上使用 * 运算符可能会创建引用而不是副本。
有没有一种简单的一行代码来创建这个空数组?我可以使用一些for循环来构建它,但是这似乎对Python来说太啰嗦了。
使用嵌套列表推导:
x = [[None for _ in range(5)] for _ in range(6)]
这里发生的情况是,该行代码
x = [[None]*5]*6
扩展为
x = [[None, None, None, None, None, None]]*6
现在你有一个包含 6 个指向单例 None
的不同引用的列表。你还有一个只包含一个引用到内部列表的列表作为其第一个且唯一条目。当你将其乘以 6 时,你会得到 5 个对内部列表的更多引用,这是你理解的。但关键是内部列表没有问题,只是外部列表有问题,因此没有必要将内部列表的构造扩展到推导式中。
x = [[None]*5 for _ in range(6)]
我认为这是尽可能简洁且易读的方式,避免了对任何列表的重复引用。
如果您不想使用numpy,可以使用字典来模拟2D数组:
>>> x = dict( ((i,j),None) for i in range(5) for j in range(6) )
>>> print x[3,4]
None