为了账号安全,请及时绑定邮箱和手机立即绑定

以前存储在列表中的数据随着其他数据的添加而变化

以前存储在列表中的数据随着其他数据的添加而变化

犯罪嫌疑人X 2021-09-11 10:07:00
当我追加(或插入)数据时,会追加“错误数据”,列表中先前存储的数据似乎也发生了变化。我的代码中遇到了一个非常奇怪的错误,这对我来说真的没有意义。我正在读一个CSV文件,它的数据存储为一个列表(ratio),从该列表中我使用np.mean(),并np.std()计算平均值和非标准偏差,并把它们存储在列表中。在这些计算过程中,我调用一个函数来检查很多事情,但重要的是:当状态发生变化时,该函数将返回一个列表(status在第一项为 1 的情况下调用。如果没有状态更改,则返回也将是一个列表,但第一项为 0。到目前为止,这里一切正常。所以我决定将crossed所有指示状态更改的返回(来自提到的函数)添加到一个新列表(称为)中,因此if status[0] == 1: 添加到列表中的数据不是预期的。请注意这一点:我print(status)在检查 if 的下方添加了一个if status[0] == 1: 并且它按预期返回,下一行是 a .append(status),它只是不附加它打印的内容。status = [0,0,0,0,0,0,0]crossed = []for i in range((len(ratio)-periods+1)):    if i == 0: #Workaround: When i = 0, ratio[-periods-0:0] won't work        mean.append(np.mean(ratio[-periods-i:]))        std.append(np.std(ratio[-periods-i:]))         lower_std.append(mean[-1]-std[-1])                  status = check_ratio(ratio[-periods],mean[-1],lower_std[-1],i,status)                   if status[0] == 1:            crossed.append(status)    else:        mean.append(np.mean(ratio[-periods-i:-i]))        std.append(np.std(ratio[-periods-i:-i]))        lower_std.append(mean[-1]-std[-1])        status = check_ratio(ratio[-periods-i],mean[-1],lower_std[-1],i,status)        if status[0] == 1:            print (status)            crossed.append(status)print(crossed)check_ratio() 函数返回一个包含大量数据的列表,但第一项总是 0 或 1。print(status)返回是这样的:(注意每个列表都是如何以 1 开头的,正如预期的那样)我切回了前几行和最后几行。这是我观察到的:第一行是正确的 ( status[0]==1) 并附加 ok第二行是对的,但第一行(以前附加)被第二行的 2 个副本替换(如何?)第三行是对的,但之前的数据被第三行的 3 个副本替换(第二行的行为相同)第四行是对的,但是之前的数据没有被替换,但是每个(之前的条目)的第一项变成了 0。(参见第四个附录下面的列表)到最后,我得到了一个毫无意义的清单。这对我来说真的很有意义。有人能看到是什么触发了这种奇怪的行为吗?
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

如果一个列表(或其他可变容器)被添加到一个列表中,并且该列表稍后发生变异,则该变异也将应用于该容器,因为它是同一个列表。如果存在后期突变的风险,请传递(或存储)列表的副本以防止此类问题(称为别名)。


# A function that accepts a list and changes it

>>> def f(sts):

...     sts[-1] = sts[-1] * 2

...     return [x for x in sts]

... 

>>> sts = [1]

>>> out = []

# Observe how the _out_ list is not what we expect (ascending powers of two)

>>> for i in range(5):

...     sts = f(sts)

...     out.append(sts)

...     print(out)

... 

[[2]]

[[4], [4]]

[[4], [8], [8]]

[[4], [8], [16], [16]]

[[4], [8], [16], [32], [32]]



# If we pass a copy of sts, we get the expected output.

>>> sts = [1]

>>> out = []

>>> for i in range(5):

...     sts = f(sts[:])

...     out.append(sts)

...     print(out)

... 

[[2]]

[[2], [4]]

[[2], [4], [8]]

[[2], [4], [8], [16]]

[[2], [4], [8], [16], [32]]


查看完整回答
反对 回复 2021-09-11
  • 1 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信