代码之家  ›  专栏  ›  技术社区  ›  Davoud Taghawi-Nejad

引用变量而不是复制变量

  •  1
  • Davoud Taghawi-Nejad  · 技术社区  · 15 年前

    当我运行下面的代码时,它会删除 deleted_partner B . 但当它从 它还将其从 A . 所以当我试图把它从 A 程序崩溃。有什么问题?

    for deleted_partner in self.list_of_trading_partners: 
        B = A[:]
        print("t", deleted_partner)
        print(B[self.ID].list_of_trading_partners)
        B[self.ID].list_of_trading_partners.remove(deleted_partner)
        Round_neo_classic(B)
        Round_costs(B)
        if B[self.ID].final_good > reference_value:
            print("d", deleted_partner)
            print(A[self.ID].list_of_trading_partners)
            A[self.ID].list_of_trading_partners.remove(deleted_partner)
    

    输出:

    ('t', 1)
    [1, 2, 3, 4]
    ('d', 1)
    [2, 3, 4]
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   Jochen Ritzel    15 年前

    B=A[:] 抄袭 只有 名单,但 它是内容。 B[self.ID] A[self.ID] 仍然引用同一对象,仅 A B 是不同的。

    您也可以显式地复制列表中的所有元素。- copy.deepcopy 可以做到这一点。但要注意:deepcopy拷贝 一切 -看起来你只想复制 list_of_trading_partners ,所以你应该写一个 __deepcopy__ 任何类的方法 [自我]身份证 就是这样。

        2
  •  2
  •   Simon    15 年前

    你不是从B或A中移除,而是从 A[some_ID].list_of_trading_partners B[some_ID].list_of_trading_partners . [:] 只制作列表的“浅拷贝”,因为它创建了一个新的、单独的列表,但该列表中包含的元素(其中一个 list_of_trading_partners 是的属性),不复制但引用。也许 copy 模块及其 deepcopy 功能可以帮助你吗?

        3
  •  1
  •   Htechno    15 年前

    由于你不把真正的清单很难做测试,购买你可以尝试用copy.copy或copy.deepcopy

    import copy
    
    for deleted_partner in self.list_of_trading_partners: 
        B = copy.copy(A)
        print("t", deleted_partner)
        print(B[self.ID].list_of_trading_partners)
        B[self.ID].list_of_trading_partners.remove(deleted_partner)
        Round_neo_classic(B)
        Round_costs(B)
        if B[self.ID].final_good > reference_value:
            print("d", deleted_partner)
            print(A[self.ID].list_of_trading_partners)
            A[self.ID].list_of_trading_partners.remove(deleted_partner)