Python在另一个列表中引用列表中的项目
我有一个变量列表(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]。
当然,我已经想出了一个解决办法,但这个办法不太好看。我在想有没有更优雅的方法来做到这一点。
2 个回答
你不能这样做。首先,整数在这里是不可变的,也就是说它们的工作方式和C/C++里的整数不一样。你不能获取一个整数的指针或引用然后去改变它(我意思是你可以获取引用,但通常这个引用指向的是一个单独的对象;你可以看看这个 x = 1; y = 1; print id(x), id(y)
;这两个id值应该是一样的,它们实际上是内存地址)。你可以做的是获取listB中元素的索引,然后去改变这个列表,例如:
listA = [0, 1]
listB[listA[0]] = 0
不过你可能在尝试做一些不应该做的事情,因为Python的工作方式和C++不一样。你到底想实现什么呢?
在Python中,一切都是引用。执行完这些语句后,listB[1]
和 listA[1]
实际上是同一个对象。(你可以通过调用 id(listB[1])
和 id(listA[1])
来检查这一点。)
至于 listA[0]
和 listB[0]
为什么不同,原因只是因为你在那个位置放了不同的引用。
根据你的描述,你并不想要一个存储 listB
中对象引用的 listA
。你想要的是一个 listA
,它是 listB
的一个“视图”。我认为你有两个选择:
创建一个特殊的序列,它内部存储对
listA
的引用,并且当调用__getitem__
和__setitem__
方法时,会在listA
中进行查找。创建特殊的引用类型,包含类似“序列和索引”的内容。把这些引用放入
listA
中。不过,要通过listA
修改listB
,你需要调用这些引用对象的某种“获取”和“设置”方法。