gpt4 book ai didi

python - 为什么这段 Python 代码(将列表扩展与自身的 map 组合在一起)会使我的系统死机?

转载 作者:太空狗 更新时间:2023-10-30 01:00:54 24 4
gpt4 key购买 nike

当我运行时

a = ['a']
a.extend(map(lambda x: 'b' + x, a))

如果我从 shell 中将它作为 Python 脚本运行,它会锁定我的系统,直到我可以执行 Ctrl+C,而从解释器中运行它使我不得不硬关闭我的笔记本电脑。

但是,

a = ['a']
a.extend(list(map(lambda x: 'b' + x, a)))

工作正常并给出了预期的结果。

为什么会这样?

起初,我认为这可能是因为我试图用在 a 本身上运行的 map 函数扩展 a,所以我写道:

a = ['a']
tmp = map(lambda x: 'b' + x, a)
a.extend(tmp)

然而,那也卡住了。

同样,这似乎工作正常:

a = ['a']
tmp = list(map(lambda x: 'b' + x, a))
a.extend(tmp)

为什么会这样?

我在 Python 3.4.3 上执行此操作。

最佳答案

这是因为在 Python 3.x 中,map() 函数返回一个迭代器,它使用传递给它的列表的引用作为第二个参数。因此,当您遍历 map 迭代器时,您也在扩展列表,并且这将无限期地继续下去,因此您要么得到 MemoryError,要么以无限循环结束。

显示此行为的示例 -

>>> m = map(lambda x: a.extend(x), a)
>>> m
<map object at 0x021E0E70>
>>> for i,x in enumerate(m):
... print("Hello")
...
Hello
Hello
.... # lots of Hello
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
MemoryError

所以当你这样做时 - a.extend(map(lambda x: 'b' + x, a)) 。你正在做类似的事情 -

a = ['a']
for x in a:
a.extend('b'+x)

如果您尝试上面的代码,您仍然会遇到 MemoryError 或无限循环。

当你这样做时——

a.extend(list(map(lambda x: 'b' + x, a)))

在扩展列表 a 之前,您通过将迭代器转换为列表来用尽迭代器,因此它不会以无限循环结束。在这种情况下,您正在做类似于-

a = ['a']
templist = []
for x in a:
templist.extend('b' + x)
a.extend(templist)

这就是为什么您没有收到错误的原因。请注意上面的代码可能不是 python 内部运行 map 的方式,它只是类似的东西。

关于python - 为什么这段 Python 代码(将列表扩展与自身的 map 组合在一起)会使我的系统死机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31421015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com