Python - ссылка на объекты в фильтрованном списке - PullRequest
0 голосов
/ 05 мая 2018

У меня есть этот Hero объект в Python

class Hero:
    def __init__(self, json_def, player_index):
        self._alive = True
        ... # other attributes

Тогда у меня есть список Hero объекта, т.е.

Heroes = [HeroObj1, HeroObj2, HeroObj3, HeroObj4]

Что я хотел бы сделать, это отфильтровать список и получить ссылку на объект, а не копии объекта. Я знаю, что могу выполнять фильтрацию, как показано ниже.

filtered_list = [x for x in Heroes if x.alive]

Однако этот подход приведет к копированию отфильтрованных объектов в filtered_list. Я хотел бы сделать ссылку, чтобы я мог изменить исходный список (Heroes), когда я изменил эту отфильтрованную версию / filtered_list (например, изменяя только живого героя).

Есть ли какое-нибудь решение для достижения того, что я ищу?

Любая помощь будет принята с благодарностью! Ура!

1 Ответ

0 голосов
/ 05 мая 2018

Возможно, я неправильно понимаю ваш вопрос, но элементы в filtered_list уже являются ссылками на те же объекты, которые содержатся в Heroes. Копии объектов не сделаны.

Изменения объектов в filtered_list также будут видны при доступе к объектам в heroes, поскольку они ссылаются на одни и те же объекты.

>>> h = Hero()
>>> l1 = [h]
>>> l2 = [x for x in l1 if x._alive]
>>> l1[0] is l2[0]    # are they same object?
True
>>> l2[0]._active = False
>>> l1[0]._active
False
>>> l1[0] is l2[0]    # are they still same object?
True

Это один и тот же объект, поэтому в списке хранятся ссылки на объекты, а не на сами объекты, и при его понимании список не создается.

...