list.append()的Python意外行为



我使用的是一个机器学习模型,我试图将他的输出附加到列表中每个元素的列表中。我使用了一个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((输出似乎没有问题,因为第一个print语句工作得很好它一定是与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]]

在我看来,它不应该跳过模型.运行(x[0](并重复模型.运行两次(x[2](

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

我认为问题是model.run返回了对模型中可变状态的引用,该引用在连续的run调用中更新——这就是为什么在run之后立即打印的内容与在其他调用后最终在列表中打印的内容之间存在差异。即,在您调用append时,该值是正确的,但在实际情况发生后会发生变化。当您调用model.run(x[2])时,它会修改并返回在您调用model.run(x[1])时返回的列表,在某个时刻,它还会修改为x[0]返回的列表。(这不是一个好的行为IMO——如果model来自外部库,希望它至少在API中记录了你不应该保留对run的返回值的引用!否则它就是恶魔般的。(

为了解决这个问题,以便您可以保持每个结果最初返回的状态,请在得到每个结果时复制一份:

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

它不会跳过任何值或重复任何其他值两次。model.run必须仅返回这些值。为了消除这种疑虑,你能更新代码打印返回值并这样打印吗:

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

最新更新