猿问

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

当我追加(或插入)数据时,会追加“错误数据”,列表中先前存储的数据似乎也发生了变化。


我的代码中遇到了一个非常奇怪的错误,这对我来说真的没有意义。


我正在读一个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。(参见第四个附录下面的列表)

到最后,我得到了一个毫无意义的清单。

这对我来说真的很有意义。有人能看到是什么触发了这种奇怪的行为吗?


犯罪嫌疑人X
浏览 204回答 1
1回答

蝴蝶不菲

如果一个列表(或其他可变容器)被添加到一个列表中,并且该列表稍后发生变异,则该变异也将应用于该容器,因为它是同一个列表。如果存在后期突变的风险,请传递(或存储)列表的副本以防止此类问题(称为别名)。# 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]]
随时随地看视频慕课网APP

相关分类

Python
我要回答