在Python中创建N*N*N列表的问题
我想在Python中创建一个三维的NNN列表,像这样:
n=3
l = [[[0,]*n]*n]*n
但是,看来这样做并没有正确地“复制”这个列表,跟我想的有点不一样:
>>> l
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
>>> l[0][0][0]=1
>>> l
[[[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]]]
我这里做错了什么呢?
5 个回答
3
正如其他人提到的,这里是在用引用来构建第二层和第三层,而不是用克隆。你可以试试这个:
>>> n = 3
>>> l = [[[0]*n for _ in xrange(n)] for _ in xrange(n)]
>>> l[0][0][0] = 1
>>> l
[[[1, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
或者如果你想少打点字:
>>> l = [[[0]*n for _ in '.'*n] for _ in '.'*n]
4
如果你想对三维矩阵进行数字处理,使用numpy会更好。其实这很简单:
>>> import numpy
>>> numpy.zeros((3,3,3), dtype=numpy.int)
array([[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]],
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]],
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]])
>>> _[0,0,0]
0
5
问题在于 * n
只是对列表进行了浅拷贝,也就是说它只是复制了列表的引用,而不是复制列表里面的内容。解决这个问题的方法是使用嵌套循环,或者可以尝试使用 numpy 这个库。