提问人:James C 提问时间:7/26/2023 最后编辑:DaraanJames C 更新时间:7/26/2023 访问量:44
为什么 list(map(..)) 在与 list.reverse 一起使用时会返回 None 列表?
why does list(map(..)) return a list of None when using it with list.reverse?
问:
说
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()
答:
你正确地识别出这是一个就地操作,这意味着它会更改列表本身,并且不会返回新列表。这就是为什么输出,因为该方法不返回任何内容(其返回值为 )。list.reverse()
None
reverse
None
需要了解的是,在你实际遍历 map 对象之前,它不会对可迭代对象的元素执行函数。map 对象是一种承诺,它说“当你需要结果时,我会执行此操作”。map
在代码中:
L = [[1,2,3],[4,5,6]]
f = lambda x: x.reverse()
K = map(f,L)
K
是一个 map 对象,并且尚未执行操作。它们正在等待迭代时执行。reverse
K
当您这样做时,它会转换为一个列表,这涉及遍历 ,这涉及对 的每个元素运行(操作)。这时子列表就会被颠倒过来。但是返回,因为返回,所以你得到的是一个 s 的列表。print(list(K))
K
K
f
reverse
L
f
None
list.reverse()
None
None
现在当你看的时候,你会看到它已经被颠倒了。这是因为当您迭代 时,该操作是在其子列表上执行的。L
reverse
K
总之,更改是在您调用 时应用的,而不是在您使用 时应用的,并给出了您,因为返回 。list(K)
K
map(f, L)
list(K)
[None, None]
f
None
如果你想使用 和 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 创建一个新列表,而不是就地反转,因此它有一个要返回的列表,并为您提供所需的结果。它保持不变。f
x
map(f, L)
L
评论
map(reversed,...)
reversed