我正在尝试填充python中的NxN
列表列表。在某种程度上,如果看作2D阵列,首先填充主对角线,然后用其他元素完成其他操作(这里不相关)。例如,如果我们在开头有dyn_arr=[[[], [], []], [[], [], []], [[], [], []]]
,则应首先变为:[[[1], [], []], [[], [1], []], [[], [], [1]]]
。我假设这段代码可能会这样做:
dyn_arr = [[[]]* N] * N
idx_set = []
for pointer in range(N):
pointer_pair = [0, pointer]
while pointer_pair[0] < N and pointer_pair[1] < N:
if pointer_pair[0] == pointer_pair[1]:
dyn_arr[pointer_pair[0]][pointer_pair[1]]=[1]
pointer_pair[0] += 1
pointer_pair[1] += 1
但它输出[[[1], [1], [1]], [[1], [1], [1]], [[1], [1], [1]]]
。有人可以解释一下发生了什么以及我该如何纠正它?
答案 0 :(得分:1)
使用乘法运算符创建列表时要小心。这种方式会将引用与列表中的对象相乘;它不会创建副本!因此,如果使用a = [[]] * 3
创建列表列表,则会创建三个元素的列表,这些元素都是相同的空数组。更改它(使用.append()
)将更改此外部列表的所有三个元素中引用的相同列表:
a = [[]] * 3
print a # prints "[[], [], []]"
a[0].append(4)
print a # prints "[[4], [4], [4]]"
print a[0] is a[1] # prints "True"
您应该始终使用列表解析创建列表列表:
# instead of dyn_arr = [[[]]* N] * N use:
dyn_arr = [ [ [] for _i in range(N) ] for _j in range(N) ]
创建后结果看起来相同,但此版本为每个条目创建 new 数组,而不是其他引用。
这可以解决原始错误导致的问题。
答案 1 :(得分:0)
import numpy as np
N = 3
z = np.zeros((N,N))
rng = np.arange(N)
z[rng, rng] = 1
print z
我希望这会有所帮助 :)