Python引用另一个列表中列表中的项

时间:2012-01-01 00:58:54

标签: python list pass-by-reference

我有一个来自另一个列表(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]。

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

2 个答案:

答案 0 :(得分:1)

python中的所有内容都是一个参考。完成所有这些陈述后,listB[1]listA[1] 字面上是同一个对象。 (您可以通过致电id(listB[1])id(listA[1])来查看。

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

根据您的描述判断,您不希望listA存储listB中对象的引用。您想要的是listAlistBlistA视图。我相信你只有两个选择:

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

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

答案 1 :(得分:1)

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

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

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