前言
运用赋值表达式(海象运算符 - python3.8特性)时想要把表达式结果赋值一个变量
a = []
a.extend(((temp := map(lambda x:x*2, [1,2]))))#temp想捕获这个map返回的迭代器
print(list(temp))
# []
疑问
这里的temp难道不是[2, 4]吗?
一度以为是海象运算符的问题,于是
type(temp)#确实是迭代器类型
list(temp)#确实还是[]
type(map(lambda x:x*2, [1,2]))#确实也是迭代器类型
list(map(lambda x:x*2, [1,2]))#确实也是[2,4]
这里就更加疑惑:
同样的对象属性怎么列表化结果不同
解答
查阅了python3.8文档关于海象运算符的说明,并没有答案,只是阐述了基本用法,难道海象不支持迭代器?这几乎是不可能的。
矛头转向map函数,用法也么问题
矛头到返回的迭代器:问题找到了。
1.迭代器是惰性序列 - 需要驱动
2.map返回的迭代器是一次性的 - 与容器区别
看下面例子:
a = [1,2]#容器
b = map(lambda x:x,a)#迭代器
for i in a:
print(i)
#1 2
for i in a:
print(i)
#1 2
#可以重复迭代
for i in b:
print(i)
#1 2
for i in b:
print(i)
#
#迭代一次后就没了
所以前言的海象没问题,只是extend方法迭代完了map返回的迭代器,最后当然是空
具体由__next__魔法方法控制