当我运行下面的代码时,它会从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]
答案 0 :(得分:2)
您不是从B或A中删除,而是从A[some_ID].list_of_trading_partners
和B[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]
仍引用相同的对象,只有A
和B
不同。
您也可以明确地复制列表中的所有元素 - copy.deepcopy可以执行此操作。但要注意:deepcopy会复制所有内容 - 看起来你只想复制list_of_trading_partners
,所以你应该在任何类__deepcopy__
上写一个A[self.ID]
方法。就是这样。