变量引用而不是复制

时间:2009-12-22 12:33:05

标签: python

当我运行下面的代码时,它会从deleted_partner中删除B。但是当它从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 个答案:

答案 0 :(得分:2)

您不是从B或A中删除,而是从A[some_ID].list_of_trading_partnersB[some_ID].list_of_trading_partners中删除。 [:]仅对列表进行“浅层复制”,因为它会创建一个新的单独列表,但不会复制该列表中包含的元素(其中一个list_of_trading_partners是其属性)但参考。也许copy模块及其deepcopy函数可以帮助您?

答案 1 :(得分:1)

既然你没有把真正的清单做很难做测试,买就可以试试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)

答案 2 :(得分:1)

B=A[:]确实只复制 列表,但它的内容。 B[self.ID]A[self.ID]仍引用相同的对象,只有AB不同。

您也可以明确地复制列表中的所有元素 - copy.deepcopy可以执行此操作。但要注意:deepcopy会复制所有内容 - 看起来你只想复制list_of_trading_partners,所以你应该在任何类__deepcopy__上写一个A[self.ID]方法。就是这样。