Все значения в списке становятся такими же, как добавленный элемент - PullRequest
0 голосов
/ 10 июля 2020

Мои желаемые данные - это значения в списках n_ac, n_bc и n_cd, и я хотел бы каждый раз добавлять эти три списка в другие три списка, называемые copyn_ac, copyn_bc и copyn_cd. Рассчитываю желаемые данные. Однако я обнаружил, что значение в copyn_ac, copyn_bc и copyn_cd становится значениями в последнем добавленном списке, и поэтому все значения в copyn_ac, copyn_bc и copyn_cd в конечном итоге становятся одинаковыми.

Вот часть моего кода (нерелевантный код был удален для более короткого сообщения):

def copy ():
    print('Desired data:n_ac=',n_ac)
    print('Desired data:n_bc=',n_bc)
    print('Desired data:n_cd=',n_cd)
    copyn_ac.append(n_ac)
    copyn_bc.append(n_bc)
    copyn_cd.append(n_cd)

def display_copyn ():
    print('copyn_ac =', copyn_ac)
    print('copyn_bc =', copyn_bc)
    print('copyn_cd =', copyn_cd)

def start_1 (cell3):
    for c in cell3:
        c.save_n()
    for c in cell3:
        c.cal_init_val()
    for c in cell3:
        c.cal_alpha_S_R()
    for c in cell3:
        c.cal_y()

def start(cell3):
    checking()
    start_1(cell3)
    copy()

def update (cell1,cell2,cell3):
    checking()      ### From Here ###
    update_1(cell1)
    update_2(cell2) ### Calculate the desired data ###
    empty_list()
    update_3(cell3) ### To Here ###
    copy()  ### copy desired data into other list

Когда я запускаю программу:

start(cell3)
display_copyn()
update(cell1,cell2,cell3)
display_copyn()
update(cell1,cell2,cell3)
display_copyn()

Вывод:

Desired data:n_ac= [33.33333333333334, 33.33333333333334]
Desired data:n_bc= [36.66666666666666, 36.66666666666666]
Desired data:n_cd= [70, 70, 70, 70, 70]
copyn_ac = [[33.33333333333334, 33.33333333333334]]
copyn_bc = [[36.66666666666666, 36.66666666666666]]
copyn_cd = [[70, 70, 70, 70, 70]]
Desired data:n_ac= [33.33333333333334, 33.33333333333334]
Desired data:n_bc= [36.66666666666666, 36.66666666666666]
Desired data:n_cd= [110.0, 30.0, 70.0, 70.0, 70.0]
copyn_ac = [[33.33333333333334, 33.33333333333334], [33.33333333333334, 33.33333333333334]]
copyn_bc = [[36.66666666666666, 36.66666666666666], [36.66666666666666, 36.66666666666666]]
copyn_cd = [[110.0, 30.0, 70.0, 70.0, 70.0], [110.0, 30.0, 70.0, 70.0, 70.0]]
Desired data:n_ac= [33.33333333333334, 33.33333333333334]
Desired data:n_bc= [36.66666666666666, 36.66666666666666]
Desired data:n_cd= [150.0, 30.0, 30.0, 70.0, 70.0]
copyn_ac = [[33.33333333333334, 33.33333333333334], [33.33333333333334, 33.33333333333334], [33.33333333333334, 33.33333333333334]]
copyn_bc = [[36.66666666666666, 36.66666666666666], [36.66666666666666, 36.66666666666666], [36.66666666666666, 36.66666666666666]]
copyn_cd = [[150.0, 30.0, 30.0, 70.0, 70.0], [150.0, 30.0, 30.0, 70.0, 70.0], [150.0, 30.0, 30.0, 70.0, 70.0]]

Ожидаемый результат после одной функции запуска и двух функций обновления:

copyn_ac = [[33.33333333333334, 33.33333333333334], [33.33333333333334, 33.33333333333334], [33.33333333333334, 33.33333333333334]]
copyn_bc = [[36.66666666666666, 36.66666666666666], [36.66666666666666, 36.66666666666666], [36.66666666666666, 36.66666666666666]]
copyn_cd = [[70, 70, 70, 70, 70],[110.0, 30.0, 70.0, 70.0, 70.0],[150.0, 30.0, 30.0, 70.0, 70.0]]

Что мне делать, чтобы получить ожидаемый результат?

Обновление: I сделал минимальный рабочий код для моей программы, и возникла та же проблема:

import numpy as np
data01=[]
copy_data=[]
class cell ():
    def __init__ (self,number, parameter,index, data=0):
        self.number = number
        self.parameter = parameter
        self.index = index
        self.data = data
    def cal_data(self):
        self.data = np.minimum(self.number,self.parameter)
        data01.append(self.data)
    def change_val(self):
        self.number = data01[self.index]*1.1*self.number
        self.parameter = data01[self.index]*1.2*self.parameter        

def save_data ():
    copy_data.append(data01)
def empty_list():
    del data01 [::]

c1 = cell(2,5,0)
c2 = cell(3,1,1)
cell_1 =[c1,c2]

def start01 (cell_1):
    for c in cell_1:
        c.cal_data()

def start (cell_1):
    start01(cell_1)
    save_data()
    print(copy_data)

def update01(cell_1):
    for c in cell_1:
        c.change_val()

def update02(cell_1):
    for c in cell_1:
        c.cal_data()

def update(cell_1):
    update01(cell_1)
    empty_list()
    update02(cell_1)
    save_data()
    print(copy_data)

Запустить программу:

start(cell_1)
update(cell_1)
update(cell_1)

Вывод:

[[2, 1]]
[[4.4, 1.2], [4.4, 1.2]]
[[21.296000000000006, 1.728], [21.296000000000006, 1.728], [21.296000000000006, 1.728]]

1 Ответ

2 голосов
/ 10 июля 2020

Проблема в том, что вы продолжаете добавлять один и тот же экземпляр списка (data01) в сохраненный список (copy_data). Итак, когда этот экземпляр изменяется, он влияет на все копии этого списка в сохраненном списке. Подумайте о copy_data как о наборе указателей, указывающих на один и тот же фактический список (data01).

Чтобы исправить это:

def save_data ():
    copy_data.append(data01.copy())
    # copy_data.append(data01).   <== old code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...