为什么 list(map(..)) 在与 list.reverse 一起使用时会返回 None 列表?

why does list(map(..)) return a list of None when using it with list.reverse?

提问人:James C 提问时间:7/26/2023 最后编辑:DaraanJames C 更新时间:7/26/2023 访问量:44

问:

L = [[1,2,3],[4,5,6]]
f = lambda x: x.reverse()
K = map(f,L)
# I want [[3,2,1],[6,5,4]]

从理论上讲,K 是反转 L 中每个子列表的映射。

print(K) #prints some map
print(L) #prints [[1,2,3],[4,5,6]]

到目前为止,L没有反转。然而

print(list(K)) #prints [None,None]
print(L)       #prints [[3,2,1],[6,5,4]]

我假设返回 since 是 L 上的就地函数。但是,当我调用 K 时不会应用更改,但当我在列表中插入 K 时会应用更改。这是怎么回事?print(list(K))[None, None]list.reverse()

Python

评论

2赞 Brian61354270 7/26/2023
这回答了你的问题吗?为什么这些列表方法(append、sort、extend、remove、clear、reverse)返回 None 而不是结果列表?
0赞 C.Nivs 7/26/2023
@OneMadGypsy 记住,它返回的是迭代器,而不是列表map(reversed,...)reversed

答:

3赞 jsibs 7/26/2023 #1

你正确地识别出这是一个就地操作,这意味着它会更改列表本身,并且不会返回新列表。这就是为什么输出,因为该方法不返回任何内容(其返回值为 )。list.reverse()NonereverseNone

需要了解的是,在你实际遍历 map 对象之前,它不会对可迭代对象的元素执行函数。map 对象是一种承诺,它说“当你需要结果时,我会执行此操作”。map

在代码中:

L = [[1,2,3],[4,5,6]]
f = lambda x: x.reverse()
K = map(f,L)

K是一个 map 对象,并且尚未执行操作。它们正在等待迭代时执行。reverseK

当您这样做时,它会转换为一个列表,这涉及遍历 ,这涉及对 的每个元素运行(操作)。这时子列表就会被颠倒过来。但是返回,因为返回,所以你得到的是一个 s 的列表。print(list(K))KKfreverseLfNonelist.reverse()NoneNone

现在当你看的时候,你会看到它已经被颠倒了。这是因为当您迭代 时,该操作是在其子列表上执行的。LreverseK

总之,更改是在您调用 时应用的,而不是在您使用 时应用的,并给出了您,因为返回 。list(K)Kmap(f, L)list(K)[None, None]fNone

如果你想使用 和 lambda 函数来反转子列表,你可以这样做:map

L = [[1,2,3],[4,5,6]]
f = lambda x: x[::-1]  # This creates a new list that's a reversed version of x
K = map(f,L)
print(list(K))  # prints [[3, 2, 1], [6, 5, 4]]

here 创建一个新列表,而不是就地反转,因此它有一个要返回的列表,并为您提供所需的结果。它保持不变。fxmap(f, L)L