繁体   English   中英

在 Python 中,为什么 x = list(map(x)) 可以,但是 x = map(x); x = list(x) 导致错误?

[英]In Python, why x = list(map(x)) is ok but x = map(x); x = list(x) causes error?

一个例子:

y = [1, 0, 0, 1]
y = list(map(lambda i: [0, 1] if i == 1 else [1, 0], y))
print(y)

这正确运行没有错误:

[[1, 0], [0, 1], [0, 1], [1, 0]]

但是,如果我将 map object 分配给一个变量,然后将其转换为如下列表:

y = [1, 0, 0, 1]
y = map(lambda i: [0, 1] if i == 1 else [1, 0], y)
y = list(y)
print(y)

它会导致错误:

Traceback (most recent call last):
  File "...\test.py", line 3, in <module>
    y = list(y)
  File "...\test.py", line 2, in <lambda>
    y = map(lambda i: [0, 1] if i == 1 else [1, 0], y)
TypeError: 'map' object is not subscriptable

这背后的机制是什么? 尽管我对 Python 字节码和汇编有一些基本的了解,但我还是很困惑。

使用 Python 3.9.7。

谢谢所有来自 stackoverflow 的人,我没想到在这篇文章之前会有这么快的帮助。 这是我的第一个。

我认为@Barmar 的详细回答解决了问题,而@ThierryLathuille 对问题的评论简要指出了我的核心底层机制。 我真诚地感谢他们!

您正在 lambda 运行之前更改 y 变量。

尝试这个

y = [1, 0, 0, 1]
m = map(lambda i: [0, 1] if y[i] == 1 else [1, 0], y)
y = list(m)

问题是您对 map 使用与原始列表相同的变量y

在原始代码块中,直到list()遍历列表后才重新分配y 因此在lambda中, y指的是原始列表,您可以使用y[i]来访问这些列表元素。

但是在将map()的结果分配给变量的版本中, lambda中的y[i]试图访问map object,而不是原始列表。 你得到那个错误是因为map object 不能被索引,只能迭代。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM