我有一个来自另一个列表(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]。
我当然想出了一个解决方案,但它的丑陋,我想知道是否有一种优雅的方式来做到这一点。
答案 0 :(得分: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
修改{{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 ++不同。你想要实现什么目标?