Python list.append() 的意外行为

Python unexpected behaviour with list.append()

我正在使用机器学习模型,我试图将他的输出附加到另一个列表中每个元素的列表中。 我使用了一个 for 循环,但它似乎循环跳转了第一个索引并重复了最后一个:

x = [[0.12], [0.36], [0.48]]

print(model.run(x[0]))    #this prints [-0.0006]
print(model.run(x[1]))    #this prints [-0.0018]
print(model.run(x[2]))    #this prints [-0.0024]

out_values = []

for value in x:
    out_values.append(model.run(value)) 

print(out_values)   #this should print [[-0.0012], [-0.0018], [-0.0024]]
# but it actually prints [[-0.0018], [-0.0024], [-0.0024]]

model.run() 输出似乎没有问题,因为第一个打印语句运行良好 一定是和out_values.append()相关的东西,因为如果我运行:

x = [[0.12], [0.36], [0.48]]

out_values = []

out_values.append(model.run(x[0]))
out_values.append(model.run(x[1]))
out_values.append(model.run(x[2]))

print(out_values) # the result I get is still [[-0.0018], [-0.0024], [-0.0024]]

在我看来,它不应该跳过 model.run(x[0]) 并重复 model.run(x[2]) 两次

这是否有记录或应该发生?还是我做错了什么?

它不会跳过任何值或重复任何其他值两次。您的 model.run 必须仅 returning 这些值。为了消除这个疑虑,您能否更新代码以打印 return 值并像这样打印:

for value in x:
    ans = model.run(value)
    print(ans)
    out_values.append(ans) 

你能显示上面的输出吗?

您可以改用此代码吗?

x = (0.12, 0.36, 0.48)

print(x[0])    #this prints [-0.0006]
print(x[1])    #this prints [-0.0018]
print(x[2])    #this prints [-0.0024]

out_values = []

out_values = set(x)

print(out_values)

它将包括 out_values

中的所有 x

我认为问题是 model.run 正在 return 引用模型中的可变状态,该状态在连续 run 调用时更新——这就是为什么两者之间存在差异的原因您在 run 之后立即打印的内容以及额外调用后列表中的内容。 IE。该值在您调用 append 时是正确的,但它会在事后发生变化。当您调用 model.run(x[2]) 时,它会修改和 return 调用 model.run(x[1]) 时它 return 编辑的列表,有时它还会修改 return编辑 x[0]。 (IMO 这不是好的行为——如果 model 来自外部库,希望它至少记录在 API 中,你不应该保留对 return 值的引用 run!否则简直就是恶魔。)

要解决此问题以便您可以保留每个结果的原始 returned,请在获得每个结果时复制一份:

out_values = [model.run(value).copy() for value in x]