Переменная ссылается вместо скопированной - PullRequest
1 голос
/ 22 декабря 2009

Когда я запускаю приведенный ниже код, он удаляет 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 ]

2 голосов
/ 22 декабря 2009

Вы удаляете не из B или A, а из A[some_ID].list_of_trading_partners и B[some_ID].list_of_trading_partners. [:] создает только «мелкую копию» списка, поскольку создает новый отдельный список, но элементы, содержащиеся в этом списке (один из которых list_of_trading_partners является атрибутом), не копируются, а имеют ссылки. Возможно, вам поможет модуль copy и его функция deepcopy?

1 голос
/ 22 декабря 2009

B=A[:] копирует только список, но не его содержимое. B[self.ID] и A[self.ID] все еще ссылаются на один и тот же объект, только A и B различны.

Вы можете также явно скопировать все элементы списка - copy.deepcopy может сделать это. Но будьте осторожны: DeepCopy копирует все - похоже, вы хотите скопировать list_of_trading_partners, поэтому вам, вероятно, следует написать метод __deepcopy__ для любого класса A[self.ID], который именно это и делает.

1 голос
/ 22 декабря 2009

Поскольку вы не ставите реальный список трудно сделать тесты, купить вы можете попробовать с 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...