首页 > 解决方案 > Python - 过滤列表中对象的引用

问题描述

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(例如,只修改活着的英雄)。

有什么解决方案可以实现我想要的吗?

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

标签: pythonreferencepass-by-reference

解决方案


也许我误解了您的问题,但其中的项目filtered_list已经引用了Heroes. 没有制作对象的副本。

如果访问 in中的对象,对 in 中的对象的修改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

它们是同一个对象,因此列表存储的是对对象的引用,而不是对象本身,并且列表推导不会生成对象的副本。


推荐阅读