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
Python3调用";列表“;有奇怪的副作用_Python_List_Python 3.x_Side Effects - Fatal编程技术网

Python3调用";列表“;有奇怪的副作用

Python3调用";列表“;有奇怪的副作用,python,list,python-3.x,side-effects,Python,List,Python 3.x,Side Effects,考虑以下两个代码片段 片段1: l = range(10) list(l) m = reversed(l) list(m) l = range(-1) list(l) list(m) l = range(10) m = reversed(l) l = range(-1) list(l) list(m) 片段2: l = range(10) list(l) m = reversed(l) list(m) l = range(-1) list(l) list(m) l = range(10)

考虑以下两个代码片段

片段1

l = range(10)
list(l)
m = reversed(l)
list(m)
l = range(-1)
list(l)
list(m)
l = range(10)
m = reversed(l)
l = range(-1)
list(l)
list(m)
片段2

l = range(10)
list(l)
m = reversed(l)
list(m)
l = range(-1)
list(l)
list(m)
l = range(10)
m = reversed(l)
l = range(-1)
list(l)
list(m)
它们之间唯一的区别是,代码片段2在其前半部分中不调用
list(l)
list(m)

奇怪的是,在代码片段1中对
list(m)
的最后一个调用返回

[] 
而在代码段2中对
list(m)
的最后一个调用返回

[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]  
这些是不同的价值观

这不是我所期望的行为。据推测,代码片段1中对
list(l)
list(m)
的早期调用触发了某种内存优化;有人能准确地向我解释发生了什么事吗

>>> l = range(10)
>>> list(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> m = reversed(l)
>>> list(m)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> l = range(-1)
>>> list(l)
[]
>>> list(m)
[]
>>>
>>> l = range(10)
>>> m = reversed(l)
>>> l = range(-1)
>>> list(l)
[]
>>> list(m)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

谢谢。

reversed
返回一个一次性使用的迭代器:第一次将迭代器馈送到
list
(从反向项构建列表)后,迭代器将耗尽

在随后的运行中,它将生成空列表,因为提供的迭代器
m
已耗尽,无法生成更多值:

m = reversed(l)
print(m) # <list_reverseiterator at 0x7fd2b8518fd0>
list(m)  # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
list(m)  # []  (exhausted)
m=反向(l)
印刷品(m)#
列表(m)#[9,8,7,6,5,4,3,2,1,0]
清单(m)#[]已用尽
在第二个代码段中,您没有像在第一个代码段中那样在
m
上调用
list
,因此不会耗尽它


最后,您只需调用它一次,就可以得到您看到的列表。

迭代器,如
reversed
的返回值,是一次性使用的。如果你想迭代两次,你需要两个迭代器。啊,我明白了。谢谢。吹毛求疵:一匹一招的小马只能做一件事,不能只做一次。最好称之为一次性使用。