在python

时间:2016-12-26 21:54:52

标签: python list python-3.x pass-by-reference

我们说我创建了两个不同的列表:

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

我想让listB中的元素引用与listA中的元素相同的对象。这样两个列表中的元素就会一起变化。

listB[2] = listA[0]
>>listB[2]
>>0

listB[2] = 2
>>listA[0]
>>2

但是,执行上述操作只会传递元素的值,因此列表仍然指向单个对象。是否有方法或不同的数据结构可以给我带来预期的效果?

2 个答案:

答案 0 :(得分:1)

这是一个简单的想法,可以帮助您入门,并帮助您更好地了解正在发生的事情:

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

但要小心:

>>> listB[0] = [3]
>>> listB
[[3], [1], [1]]
>>> listA
[[2], [0], [0]]

您可以编写一个使其不可见的类,使其看起来更像一个列表,更容易使用而不会出错。

答案 1 :(得分:1)

你不能这样做。你可以让listAlistB本身成为同一个对象,在这种情况下, all 它们的索引将反映对它们所做的任何更改,或者你可以将它们作为单独的对象,在这种情况下,他们的索引 none 将反映变化。你不能制作两个在"加入的列表,只共享一些索引参考。

假设listB[2]的值是一个名为obj的对象。当您执行listB[2] = 2之类的操作时,您无法更改obj;你正在改变listB(通过使其索引2指向其他对象)。所以你不能让listA[2]"反映" listB[2]除非listAlistB是同一个对象。你当然可以让listA[2]listB[2]引用相同的对象,但这不会影响你执行listB[2] = 2时会发生什么,因为该操作不会影响到共享对象。