Python - 过滤列表中对象的引用

时间:2018-05-05 04:27:31

标签: python reference pass-by-reference

我在python中有这个Hero对象

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 :(得分:1)

也许我误解了你的问题,但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

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

相关问题