Python 从其他列表的元素创建新列表,并引用后者的元素
我想从以前的元素创建一个新列表,但不复制它们。情况就是这样:Python 从其他列表的元素创建新列表,并引用后者的元素,python,list,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(
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作为列表中某些特定元素的代表。我猜应该有一种很好的方法来组成一个列表,当我同时更改list的值时,它可以让我有机会编辑list元素的值 变量中的任何地方
1
或另一个小数字都将始终具有相同的id。这些数字只存在一次,并且由于它们是不可变的,因此可以在任何地方引用它们
使用切片语法总是复制一份
设置list1[1]
时,您并没有更改存储在内存中的内容的值,而是将list1[1]
指向内存中的新位置。因此,由于您没有将list2[1]
指向其他位置,它仍然指向旧的位置和值
切勿命名变量列表
,因为有一个内置函数使用该名称
如果您想以最少的修改完成您正在谈论的内容,请尝试:
list1 = [[x] for x in range(10)]
list2 = list1[:4]
list1[1][0] = 100
print list2
您只需始终在要引用的项目之后添加[0]。由于列表不会被替换,只有列表中的项目,并且
list2
指向列表而不是项目,它将保持同步。任何位置1
或变量中的另一个小数字,它将始终具有相同的id。这些数字只存在一次,并且由于它们是不可变的,在任何地方引用它们都是安全的
使用切片语法总是复制一份
设置list1[1]
时,您并没有更改存储在内存中的内容的值,而是将list1[1]
指向内存中的新位置。因此,由于您没有将list2[1]
指向其他位置,它仍然指向旧的位置和值
切勿命名变量列表
,因为有一个内置函数使用该名称
如果您想以最少的修改完成您正在谈论的内容,请尝试:
list1 = [[x] for x in range(10)]
list2 = list1[:4]
list1[1][0] = 100
print list2
您只需始终在要引用的项目之后添加[0]。由于列表不会被替换,只替换其中的项目,并且
list2
指向列表而不是项目,因此它将保持同步。使用可变类型作为列表元素。例如:
>>> a = [[1], [2]]
>>> b = a[1]
>>> a
[[1], [2]]
>>> b
[2]
>>> b[0]=[3]
>>> a
[[1], [[3]]]
>>> b
[[3]]
>>>
使用可变类型作为列表元素。例如:
>>> a = [[1], [2]]
>>> b = a[1]
>>> a
[[1], [2]]
>>> b
[2]
>>> b[0]=[3]
>>> a
[[1], [[3]]]
>>> b
[[3]]
>>>
哦,你说得对。但是有没有一种方法可以让我达到并改变这两个列表之前指向的值。例如,我应该存储每个对象的id,然后通过它们的id访问它们吗?不过,这似乎不是一个优雅的解决方案,在Python中,您永远不会真正更改值,只需创建一个新值并指向它即可。尝试存储索引列表(因此list2将是
[0,1,2,3]
——这是一个糟糕的示例,因为您的值和它们的索引是相同的)并像list1[list2[0]]
一样查找它们。哦,您是对的。但是有没有一种方法可以让我达到并改变这两个列表之前指向的值。例如,我应该存储每个对象的id,然后通过它们的id访问它们吗?不过,这似乎不是一个优雅的解决方案,在Python中,您永远不会真正更改值,只需创建一个新值并指向它即可。尝试存储索引列表(因此list2将是[0,1,2,3]
——这是一个糟糕的示例,因为您的值和它们的索引是相同的)并像list1[list2[0]]
一样查找它们。