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

3 投票
2 回答
3577 浏览
提问于 2025-04-17 09:20

我有一个变量列表(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 个回答

1

你不能这样做。首先,整数在这里是不可变的,也就是说它们的工作方式和C/C++里的整数不一样。你不能获取一个整数的指针或引用然后去改变它(我意思是你可以获取引用,但通常这个引用指向的是一个单独的对象;你可以看看这个 x = 1; y = 1; print id(x), id(y);这两个id值应该是一样的,它们实际上是内存地址)。你可以做的是获取listB中元素的索引,然后去改变这个列表,例如:

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

不过你可能在尝试做一些不应该做的事情,因为Python的工作方式和C++不一样。你到底想实现什么呢?

1

在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,你需要调用这些引用对象的某种“获取”和“设置”方法。

撰写回答