[英]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.