首页 > 解决方案 > 将值附加到对象内的数组(循环对象)

问题描述

这是这个问题的简洁版本。因为我改变了这么多,所以我提出了一个新问题

我试图从一个较长的数组中获取某些值solution并将它们放入一个较小的数组中,在一个对象中。这段代码应该将数组的前半部分solution放入x_histinside m1,将数组的后半部分solution放入x_histinside m2。相反,它似乎采用了所有solution数组并将其放入x_hist两个对象中。有谁知道为什么会这样?我是否不小心对代码进行了矢量化?

class Mass:
    x_hist = []

m1 = Mass()
m2 = Mass()
ms = [m1,m2]

solution = [1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0]

for i in range(len(ms)):
    for k in range(int(len(sol)/len(ms))):
        ms[i].x_hist.append(solution[k+8*i])

print(m1.x_hist)
print(m2.x_hist)

输出是:

[1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0]

我正在尝试获得以下输出:

[1, 2, 3, 4, 5, 6, 7, 8]
[0, 0, 0, 0, 0, 0, 0, 0]

标签: pythonvectorization

解决方案


x_hist 属性是静态类属性

在类中声明的变量是与实例上下文不同的静态变量,这意味着,

>>> s = M()
>>> s
<__main__.M object at 0x7f9ffb4a6358>
>>> s.i
3
>>> M.i
3
>>> s.i = 4
>>> M.i
3
>>> s.i
4



class Mass:
    #x_hist = [] shared by all classes its static
    def __init__(self):
        self.x_hist = []

m1 = Mass()
m2 = Mass()
ms = [m1,m2]

solution = [1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0]

for i in range(len(ms)):
    for k in range(int(len(sol)/len(ms))):
        ms[i].x_hist.append(solution[k+8*i])

print(m1.x_hist)
print(m2.x_hist)

对于静态方法和 ClassMethod 检查这里

有关课程的精彩教程,请参阅此处


推荐阅读