这是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]
答案 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进行访问,但是除非有必要,否则可能不应该使用类变量。