Python如何从一个列表中引用另一个列表中的项目?

3

我有一个变量列表(listA)来自另一个列表(listB)。我的问题是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]。
当然,我已经想出了一个解决方案,但它很丑陋,我想知道是否有一种优雅的方法来完成这个任务。

你做不到。如果你需要帮助使一段代码更优美:请在 http://codereview.stackexchange.com 上发布它。那里的某个人会指出一个更优雅的解决方案来解决你的问题。 - Winston Ewert
2个回答

1

Python 中的所有东西都是引用。在执行所有这些语句之后,listB[1]listA[1] 实际上是同一个对象(您可以通过调用 id(listB[1])id(listA[1]) 进行检查)。

listA[0]listB[0] 之所以不同,仅仅是因为您将不同的引用放入了该位置。

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

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

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


1

不行。首先,整数是不可变的,并且它们不像 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编程技能,我想知道是否有一种Python式/优雅的方法来解决这个问题。 - Ameer Opat
1
对于这样的事情,我认为你应该使用NumPy或SciPy,它们是专门为此创建的Python库。如果您想使用纯Python,则最好记住子矩阵的索引并更改列表中的值。简单地说,不要存储子矩阵的值,而是存储此子矩阵的左上角,并更改原始表中的值。也许您可以用C或C ++展示一个简短的片段(但是,认真点,保持简短),然后我们可以尝试编写相同的Python代码。 - gruszczy
@AmeerOpat,我不是非常清楚你在做什么,但我建议考虑创建一个新的矩阵,而不是修改现有的矩阵。这通常会产生更符合Python风格的解决方案。(正如我上面提到的,如果您发布在代码审查上,可以获得更好的反馈意见) - Winston Ewert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接