Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从其他列表的元素创建新列表,并引用后者的元素_Python_List - Fatal编程技术网

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]]
一样查找它们。