Добавление значений к массиву внутри объекта (циклическое перемещение по объектам) - PullRequest
0 голосов
/ 04 марта 2019

Это незагроможденная версия этого вопроса.Поскольку я так сильно изменился, я задал новый вопрос

Я пытаюсь взять определенные значения из более длинного массива solution и поместить их в меньший массив внутри объекта.Этот код должен взять первую половину массива solution и поместить его в x_hist в m1, а вторую половину массива solution и поместить в x_hist в 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]

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Я подозревал, что произошло следующее, но я до конца не понимаю.По сути, конструкция вашего класса неверна: 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]
0 голосов
/ 04 марта 2019

Проблема в основном во вложенных циклах!как только первая итерация внешнего цикла завершена, вы перезапускаете внутренний цикл, поэтому в основном добавляете первую половину в оба списка.

Для удобства чтения лучше переписать циклы:

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]

РЕДАКТИРОВАТЬ:

Атрибут класса, общий для всех вышеупомянутых экземпляров, доступен:

Mass.x_hist

И он будет содержать все элементы решения.Если вы просто пытаетесь получить доступ к x_hist экземпляра, вы правы для доступа через m1.x_hist, но вам, вероятно, не следует использовать переменные класса без необходимости.

0 голосов
/ 04 марта 2019

, поскольку ваше свойство 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...