我想从前一个元素创建一个新列表,但不复制它们。这就是发生的事情:
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作为列表的某些特定元素的代表。我猜我应该有一个很好的方法来编写一个列表,让我有机会编辑列表元素的值,当我也改变列表的值时。
答案 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]]
>>>