将值附加到对象内的数组(在对象上循环)

时间:2019-03-04 12:56:17

标签: python vectorization

这是this问题的简洁版本。由于我做了很多更改,所以我提出了一个新问题

我试图从较长的数组solution中获取某些值,并将它们放入对象内的较小数组中。该代码应采用solution数组的前半部分并将其放入x_hist内的m1中,并将solution数组的后半部分并放入{ x_hist中的{1}}。取而代之的是,它似乎将所有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]

3 个答案:

答案 0 :(得分:5)

因为您的x_hist属性是所有类共享的静态类属性

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)

答案 1 :(得分:1)

我怀疑情况是这样,但我还不完全了解。本质上,您的类构造不正确:x_hist从未被声明为Mass()类的属性。因此,它只是附加到(我假设)全局声明的x_hist

class Mass():
    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(solution)/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]

答案 2 :(得分:0)

问题基本上在嵌套循环中! 一旦完成了外部循环的第一次迭代,就可以重新启动内部循环,因此基本上可以将前半部分添加到两个列表中。

为了便于阅读,最好重写循环:

step = int(len(solution)/len(ms))
for m, k in zip(ms, range(0,len(solution), step)):
    m.x_hist.extend(solution[k : k+step])
print(m1.x_hist)
print(m2.x_hist)
[1, 2, 3, 4, 5, 6, 7, 8]
[0, 0, 0, 0, 0, 0, 0, 0]

编辑:

上述所有实例共享的class属性可以通过以下方式访问:

Mass.x_hist

这将包含所有解决方案元素。 如果仅尝试访问实例的x_hist,则可以通过m1.x_hist进行访问,但是除非有必要,否则可能不应该使用类变量。