Python-筛选列表中对象的引用

Python-筛选列表中对象的引用,python,reference,pass-by-reference,Python,Reference,Pass By Reference,我有一个python中的英雄对象 class Hero: def __init__(self, json_def, player_index): self._alive = True ... # other attributes 然后,我有英雄对象列表,即 Heroes = [HeroObj1, HeroObj2, HeroObj3, HeroObj4] 我想做的是过滤列表并获取对象引用,而不是对象的副本。我知道我可以做如下过滤 filtered_li

我有一个python中的英雄对象

class Hero:
    def __init__(self, json_def, player_index):
        self._alive = True
        ... # other attributes
然后,我有英雄对象列表,即

Heroes = [HeroObj1, HeroObj2, HeroObj3, HeroObj4]
我想做的是过滤列表并获取对象引用,而不是对象的副本。我知道我可以做如下过滤

filtered_list = [x for x in Heroes if x.alive]
但是,这种方法将导致将过滤对象复制到过滤列表中。我想做参考,这样当我修改这个过滤版本/过滤列表时,我可以修改最初的英雄列表,例如,只修改活着的英雄

是否有任何解决方案来实现我所寻找的目标


任何帮助都将不胜感激!干杯

也许我误解了你的问题,但是过滤列表中的项目已经引用了英雄中的相同对象。尚未制作对象的副本

如果访问heroes中的对象,对filtered_列表中对象的修改也将可见,因为它们引用相同的对象

>>> 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

它们是同一个对象,因此列表存储的是对对象的引用,而不是对象本身,并且列表理解不会复制对象。

输入错误:在if中使用==来比较相等性。=就这一点而言,您甚至不需要==那里,只要x.alive.No,[x代表英雄中的x,如果x.alive]创建了一个引用原始对象的新列表。对象不会被复制。您可以通过执行筛选列表[0]来测试这一点。\u alive=这是一个测试。