代码之家  ›  专栏  ›  技术社区  ›  Darren Christopher

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

  •  0
  • Darren Christopher  · 技术社区  · 6 年前

    我有这个 Hero 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]
    

    但是,这种方法将导致将过滤后的对象复制到 filtered_list 。我想做参考,以便修改初始列表( Heroes )当我修改此筛选版本时/ 筛选的\u列表 (例如,仅修改活着的英雄)。

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

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   mhawke    6 年前

    也许我误解了你的问题,但是 filtered_list 已引用中保存的相同对象 Heroes 。尚未制作对象的副本。

    对中对象的修改 筛选的\u列表 如果访问中的对象,也将可见 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
    

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