我的程序是这样开始的
array=[[[0,0]]*4]*4
for i in range(4):
for k in range(4):
array[i][k]=[i,k]
for n in range(4):
print(array[n])
但是输出这个
[[3, 0], [3, 1], [3, 2], [3, 3]]
[[3, 0], [3, 1], [3, 2], [3, 3]]
[[3, 0], [3, 1], [3, 2], [3, 3]]```
I'm using 3.11, I tried switching i and k around, switching the names for the variables, doing
array[我][k] [0] = karray[我][k][1] =我
etc. but none of it has worked. I want it to output
```[[0, 0], [0, 1], [0, 2], [0, 3]]
[[1, 0], [1, 1], [1, 2], [1, 3]]
[[2, 0], [2, 1], [2, 2], [2, 3]]
[[3, 0], [3, 1], [3, 2], [3, 3]]```
这也可以认为是两个数组[0, 1, 2, 3]
的笛卡尔积。您可以使用itertools.product
很容易地实现这一点。
import itertools
list(itertools.product([0, 1, 2, 3], [0, 1, 2, 3]))
返回[(0, 0), (0, 1), (0, 2), (0, 3),
(1, 0), (1, 1), (1, 2), (1, 3),
(2, 0), (2, 1), (2, 2), (2, 3),
(3, 0), (3, 1), (3, 2), (3, 3)]
这也相当于只做:
[[x, y] for x in [0, 1, 2, 3] for y in [0, 1, 2, 3]]
[[0, 0], [0, 1], [0, 2], [0, 3],
[1, 0], [1, 1], [1, 2], [1, 3],
[2, 0], [2, 1], [2, 2], [2, 3],
[3, 0], [3, 1], [3, 2], [3, 3]]
array = [[[0, 0]] * 4] * 4
你认为你有许多独立的零对列表。
但实际上只有很少的列表有一堆指向它们的指针。也就是说,每次赋值都会更新一个列表元素,但是因为多个外部列表都指向容器,此更新似乎会影响多个位置。
你会更快乐PIP安装numpy(import numpy as np
)和赋值
array = np.array([[[0, 0]] * 4] * 4)
将分配单独的整数存储空间对于每个单元格,您可以更新它们独立地,随心所欲,没有惊喜。
下面是一个更简单的效果演示
>>> a = b = c = [5, 6, 7, 8]
>>> a
[5, 6, 7, 8]
>>> b
[5, 6, 7, 8]
>>> c
[5, 6, 7, 8]
>>>
>>>
>>> a[2] = 20
>>>
>>> a
[5, 6, 20, 8]
>>>
>>> b
[5, 6, 20, 8]
>>>
>>> c
[5, 6, 20, 8]
注意b
是指向与a
相同的列表的指针,还有c
.
只有一个列表,它没有只有一个名字。从某种意义上说,这些都是三个名字同样有效。我们有三个对相同底层列表的引用。