【问题标题】:Python referring to an item in a list from another listPython 从另一个列表中引用列表中的项目
【发布时间】:2012-01-01 00:58:53
【问题描述】:

我有一个来自另一个列表 (listB) 的变量列表 (listA)。我遇到的问题是 listB 中的项目是通过值而不是通过引用传递给 listA 的。在将值放入 listA 后,我是否可以访问 listB 中的对象?

例如:

listB = [1,2,3,4,5]
listA = [listB[0], listB[1]]
listA[0] = 0

这使得 listA 等于 [0, 2],并且 listB 保持不变。我想修改 listB 使其变为 [0,2,3,4,5]。

我当然想出了一个解决方案,但它很难看,我想知道是否有一种优雅的方式来做到这一点。

【问题讨论】:

  • 你不能。如果您需要帮助对一段代码进行去丑化:将其发布到 codereview.stackexchange.com。有人会为您的问题指出一个更优雅的解决方案。

标签: python list pass-by-reference


【解决方案1】:

python 中的一切都是参考。执行完所有这些语句后,listB[1] 和 listA[1] 字面上是同一个对象。 (您可以致电id(listB[1]) 和id(listA[1]) 进行检查。

listA[0] 和 listB[0] 不同的原因仅仅是因为您在该位置放置了不同的引用。

从你的描述来看,你不想要一个listA 来存储对listB 中对象的引用。您想要的是listA,它是listB 的视图。我相信你只有两个选择:

  • 创建一个特殊序列,该序列在内部存储对listA 的引用,其__getitem__ 和__setitem__ 方法在调用时执行对listA 的查找。

  • 创建特殊的特殊引用类型,其中包含类似“序列和索引”的内容。将这些引用放入listA。但是,要修改 listB 到 listA,您必须调用这些引用对象的某种“get”和“set”成员。

【讨论】:

    【解决方案2】:

    你不能。首先,整数是不可变的,它们不像 C/C++ 中的整数那样工作。你不能得到一个整数的指针/引用然后改变它(我的意思是你可以,你总是有一个引用,但它通常是对单个对象的引用;检查这个x = 1; y = 1; print id(x), id(y);id 值应该是相同的并且它们是内存地址)。您可以做的是获取 listB 中元素的索引并更改列表,例如:

    listA = [0, 1]
    listB[listA[0]] = 0
    

    但可能你正在尝试做一些你不应该做的事情,因为 Python 的工作方式与 C++ 不同。你想达到什么目的?

    【讨论】:

    • 我有一个大小为 n 的数据矩阵,我正在检查该矩阵的每个可能的 2x2 子集。然后,我将该 2x2 子集中的 4 个值存储在一个列表中并检查它们的值。根据该 2x2 子集的内容,我必须修改大小为 n 的原始数据矩阵。我想同样的事情,存储 2x2 矩阵所持有的原始矩阵的索引,但这需要更复杂的数据类型和/或不太优雅的解决方案。由于我正在努力提高我的 python 编程技能,我想知道是否有一个 pythonian/优雅的人这样做。
    • 对于此类事情,我认为您应该使用 NumPy 或 SciPy,它们是专门为此创建的 python 库。如果您想使用纯 python,您最好的选择是记住子矩阵的索引并更改列表中的值。与其存储子矩阵的值,不如简单地存储该子矩阵的左上角并更改原始表中的值。也许你可以用 C 或 C++ 提供一个简短的 sn-p(但说真的,保持简短),我们可以尝试用 Python 编写代码,这样做也是如此。
    • @AmeerOpat,我对你在做什么并不是很清楚,但我建议考虑创建一个新矩阵而不是修改现有矩阵。这通常会产生一个更 Pythonic 的解决方案。 (正如我上面提到的,如果您在代码审查上发帖,可以获得更好的反馈)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多