Python3调用";列表“;有奇怪的副作用
考虑以下两个代码片段 片段1: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)
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
的返回值,是一次性使用的。如果你想迭代两次,你需要两个迭代器。啊,我明白了。谢谢。吹毛求疵:一匹一招的小马只能做一件事,不能只做一次。最好称之为一次性使用。