【问题标题】:All values in list become same as appended element列表中的所有值都与附加元素相同
【发布时间】:2020-07-10 15:24:34
【问题描述】:

我想要的数据是列表n_acn_bcn_cd中的值,我想每次都将这三个列表附加到其他三个名为copyn_accopyn_bccopyn_cd的列表中我计算所需的数据。但是,我发现copyn_accopyn_bccopyn_cd 中的值成为最新附加列表中的值,因此copyn_accopyn_bccopyn_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]]

我应该怎么做才能获得预期的输出?

更新: 我为我的程序做了一个最小的工作代码,同样的问题发生了:

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]]

【问题讨论】:

  • 感谢您的回复,但在更改为copyn_cd.append(n_cd) 后,输出变为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] 其中len(copyn_cd) =15 与预期输出的len(copyn_cd) = 3 相比略有不同。
  • 对不起..你能发布一个最小的工作代码吗?
  • 我已经在帖子中上传了一个最小的工作代码,看看它是否有帮助
  • 你怎么打电话给start(cell_1) ...?最小的例子是缺少对 start() 的调用...
  • 我在函数start01(cell_1)的代码下面有函数start(cell_1)start01(cell_1)将在调用start(cell_1)后运行

标签: python append


【解决方案1】:

问题是您不断将相同的列表实例 (data01) 添加到已保存的列表 (copy_data) 中。因此,当该实例更改时,它会影响已保存列表中该列表的所有副本。将copy_data 视为指针的集合,都指向同一个实际列表(data01)。

修复它:

def save_data ():
    copy_data.append(data01.copy())
    # copy_data.append(data01).   <== old code

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多