从其他列表的元素创建新列表,引用后者的元素

时间:2011-07-27 08:04:50

标签: python list

我想从前一个元素创建一个新列表,但不复制它们。这就是发生的事情:

In [23]: list = range(10)

In [24]: list2 = list[0:4]

In [25]: list
Out[25]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [26]: list2
Out[26]: [0, 1, 2, 3]

虽然列表中的元素似乎具有相同的ID,

In [29]: id(list[1])
Out[29]: 145137840

In [30]: id(list2[1])
Out[30]: 145137840

编辑一个元素后,我不会更改引用的对象,而是更改列表中该网站的值。

In [31]: list[1] = 100

In [32]: id(list[1])
Out[32]: 145138628

In [33]: id(list2[1])
Out[33]: 145137840

In [34]: list
Out[34]: [0, 100, 2, 3, 4, 5, 6, 7, 8, 9]

In [35]: list2
Out[35]: [0, 1, 2, 3]

我想使用list2作为列表的某些特定元素的代表。我猜我应该有一个很好的方法来编写一个列表,让我有机会编辑列表元素的值,当我也改变列表的值时。

2 个答案:

答案 0 :(得分:2)

任何地方1或其他小数字都在变量中,它将始终具有相同的ID。这些数字只存在一次,因为它们是不可变的,所以在任何地方都可以安全地引用它们。

使用切片语法[:]始终会复制。

当您设置list1[1]时,您没有更改存储在内存中的值,而是将list1[1]指向内存中的新位置。因此,由于您未将list2[1]指向其他位置,因此它仍指向旧位置和值。

永远不要命名变量list,因为该名称有内置函数。

如果您想通过最少的修改来做您正在谈论的事情,请尝试:

list1 = [[x] for x in range(10)]
list2 = list1[:4]
list1[1][0] = 100
print list2

您只需要在要引用的项目后面添加[0]。由于列表没有被替换,只是其中的项目,list2指向列表而不是项目,它将保持同步。

答案 1 :(得分:1)

使用可变类型作为列表元素。例如:

>>> a = [[1], [2]]
>>> b = a[1]
>>> a
[[1], [2]]
>>> b
[2]
>>> b[0]=[3]
>>> a
[[1], [[3]]]
>>> b
[[3]]
>>>