Python - 迭代器陷阱

前言


运用赋值表达式(海象运算符 - 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__魔法方法控制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值