2009-12-22 43 views
1

当我运行下面的代码时,它从B中删除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] 
+0

是python 3还是你有自定义打印功能? – 2009-12-22 12:42:00

+0

'print(“Fine in Py2 too”)''因为这些括号只是组合而且在这里没有效果。 – 2009-12-22 12:59:53

回答

1

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

您可能会明确复制列表中的所有元素 - copy.deepcopy可以执行此操作。但要小心:深拷贝一切 - 它看起来像你只想复制list_of_trading_partners,所以你应该写一个__deepcopy__方法A[self.ID]就是这样做。

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) 
+1

这确实是一种解决方法,但我认为OP并不是唯一一个想知道的问题,因为拼接操作符以这种方式使用_does_生成副本。 – 2009-12-22 12:43:01

2

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

相关问题