【问题标题】:Copying element from one list to another in python在python中将元素从一个列表复制到另一个列表
【发布时间】:2016-12-26 21:54:51
【问题描述】:

假设我创建了两个不同的列表:

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

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

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

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

但是上面的操作只是传递元素的值,所以列表仍然是指单个对象。有没有一种方法或不同的数据结构可以给我想要的效果?

【问题讨论】:

  • 巧合的是,当你说listA = listB 或反之亦然时,这几乎已经发生了。详情请见here
  • 只需创建listA = listB,两个引用一个列表。否则,您不能在普通列表对象之间共享引用,不。
  • 如果您使用的是对象,您可以假设,但不适用于整数。
  • @MartijnPieters 我认为他只希望每个列表中的 一个 元素对应,而不是全部。
  • @leaf:我知道,但你不能那样做,所以没有其他选择。

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


【解决方案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]]

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

【讨论】:

    【解决方案2】:

    你不能那样做。您可以让listAlistB 本身成为同一个对象,在这种情况下所有它们的索引将反映对其中任何一个所做的任何更改,或者您可以使它们成为单独的对象,在这种情况下 没有一个他们的指数会反映变化。您不能创建两个“在臀部连接”的列表,只共享它们的一些索引引用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多