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]
我正在使用机器学习模型,我试图将他的输出附加到另一个列表中每个元素的列表中。 我使用了一个 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]