gpt4 book ai didi

python - 不理解python的三维列表的行为(对子列表的引用是相同的)

转载 作者:太空宇宙 更新时间:2023-11-03 19:17:56 25 4
gpt4 key购买 nike

我不明白为什么下面的代码会有这样的行为。

import numpy as np


nbr_arrays = 4
nbr_fields_per_array = 3
nbr_subfields_per_field = 2

# pre-allocate zeros list
zeros = np.zeros(nbr_subfields_per_field)

data = []
for array in range(nbr_arrays):

# pre-allocate the subarray
empty_array = []
for empty_array_index in range(nbr_fields_per_array):
empty_array.append(zeros)

# append pre subarray to data
data.append(empty_array)

# fill up data
for j in range(nbr_fields_per_array):
for k in range(nbr_subfields_per_field):
data[array][j][k] = j*k*array

生成的输出data现在读取:

[[array([ 0.,  6.]), array([ 0.,  6.]), array([ 0.,  6.])],
[array([ 0., 6.]), array([ 0., 6.]), array([ 0., 6.])],
[array([ 0., 6.]), array([ 0., 6.]), array([ 0., 6.])],
[array([ 0., 6.]), array([ 0., 6.]), array([ 0., 6.])]]

甚至读起来也完全不同:

array([ 0.,  6.])

如果我查看不同列表的标识,这就是我得到的:

id(data[0][0])
Out[72]: 45790208

id(data[1][0])
Out[66]: 45790208

id(data[2][0])
Out[67]: 45790208

id(data[3][0])
Out[68]: 45790208

id(zeros)
Out[69]: 45790208

为什么所有的引用文献都是一样的?为什么zero突然包含非零值?

如果有人可以向我解释这里到底发生了什么,以及我如何修改代码才能看到预期的行为(输出),我将非常感激.

编辑:

不使用,而是使用[[0]*nbr_subfields_per_field for x in range(nbr_fields_per_array)]而不是给我预期的结果。但为什么?为什么原来的代码不起作用?修改后的代码有效:

data = []
for array in range(nbr_arrays):
empty_array = [[0]*nbr_subfields_per_field for x in range(nbr_fields_per_array)]

''' this is causing the weird behaviour
empty_array = []
for empty_array_index in range(nbr_fields_per_array):
empty_array.append(zeros)
'''

data.append(empty_array)

for j in range(nbr_fields_per_array):
for k in range(nbr_subfields_per_field):
data[array][j][k] = j*k*array

最佳答案

# pre-allocate zeros list
zeros = np.zeros(nbr_subfields_per_field)

这将创建一个对象。

for empty_array_index in range(nbr_fields_per_array):
empty_array.append(zeros)

这会不断附加相同的对象。

停止预分配。

关于python - 不理解python的三维列表的行为(对子列表的引用是相同的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10729049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com