python3对“list”的调用有奇怪的副作用

2024-10-02 06:21:24 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下两个代码段。你知道吗

片段1

l = range(10)
list(l)
m = reversed(l)
list(m)
l = range(-1)
list(l)
list(m)

片段2

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]

谢谢你。你知道吗


Tags: 内存代码代码段rangelist价值观地向区别
1条回答
网友
1楼 · 发布于 2024-10-02 06:21:24

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)

在第二个代码段中,您没有像在第一个代码段中那样调用list上的m,因此不会耗尽它。你知道吗

最后,你只会给它打一次电话,然后得到你看到的清单。你知道吗

相关问题 更多 >

    热门问题