【问题标题】:Replacing references in Python3替换 Python3 中的引用
【发布时间】:2016-01-06 15:03:24
【问题描述】:

我有一个 Pythonic 列表,其中包含可能重复的对象。例如,

t_list = [object1, object2, object3, object1, object1, object5]

为了消除重复我使用list(set(t_list))。但是在我的数据方案中有很多对象,其中包含对t_list 元素的引用。所以,如果我从列表中删除一些元素,对它们的引用仍然存在。

我需要在删除重复后自动替换所有现有的引用。例如,如果我从 t_list 中删除第 3 和第 4 个元素,引用将指向 t_list[0]

如何在不遍历数据方案的所有元素的情况下做到这一点?这可能吗?

【问题讨论】:

  • 因此,对于您的示例,结果将是 [object1, object2, object3, t_list[0], t_list[0], object5]?
  • 试试this OrderedSet recipe,可能正是你需要的数据结构。
  • 让我直截了当地说 - 假设您有类似 found in this gist 的代码。假设您从t_list 中删除了所有list_one,您想将该删除传播到other_list??
  • 您的数据模型如何引用 t_list 中的项目?您的意思是您在方案中存储了索引而不是对象引用?您的数据是否引用了 t_list?听你说的好像没什么事可做,没必要修改数据。
  • @Reti43,不,结果必须是list(set(t_list)),即[object1, object2, object3, object5]

标签: python python-3.x pass-by-reference


【解决方案1】:

假设您有一个列表和一个数据对象:

t_list = [object1, object2, object3, object1, object1, object5]
# ...
data = {
    'some_path': t_list[1],
    'some_more': {
        t_list[3]
    }
};

这意味着您的数据不依赖于任何形式的列表。您的数据引用了列表中的对象,但这些引用完全独立于 t_list。这意味着如果您更改列表:

t_list = list(set(t_list))

这对您的data 对象没有任何影响,无需进一步操作。您甚至可以忽略该列表。

编辑:

这个小图说明了内存中的对象、列表和它们之间的引用:

t_list 上的转换将删除其中的任何多个引用,但数据不会以任何方式更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多