加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

这个Python魔法是什么?

发布时间:2020-12-20 12:12:56 所属栏目:Python 来源:网络整理
导读:如果你这样做{k:v for k,v in zip(* [iter(x)] * 2)}其中x是一个列表,你会得到一个字典,其中包含所有奇数元素作为键,甚至是作为他们的价值观哇! x = [1,"cat","hat",35,2.5,True] d = {k:v for k,v in zip(*[iter(x)]*2)} d{1: "cat","hat": 35,2.5: True}
如果你这样做{k:v for k,v in zip(* [iter(x)] * 2)}其中x是一个列表,你会得到一个字典,其中包含所有奇数元素作为键,甚至是作为他们的价值观哇!

>>> x = [1,"cat","hat",35,2.5,True]
>>> d = {k:v for k,v in zip(*[iter(x)]*2)}
>>> d
{1: "cat","hat": 35,2.5: True}

我基本了解字典理解是如何工作的,zip是如何工作的,如何*提取参数,如何[iter(x)] * 2连接列表的两个副本,所以我期待像{一样一对一的对应关系1:1,“猫”:“猫”……}.

这里发生了什么?

解决方法

这肯定是一段有趣的小代码!它可能没有预料到的主要因素是对象实际上是通过引用传递的(它们实际上是 passed by assignment,但是嘿). iter()构造一个对象,因此“复制”它(在列表中使用乘法,在这种情况下)不会创建一个新对象,而是添加另一个对同一个对象的引用.这意味着你有一个列表,其中l [0]是一个迭代器,l [1]是相同的迭代器 – 访问它们都访问同一个对象.

每次访问迭代器的下一个元素时,它都会继续它最后一次停止的位置.由于元素在zip()创建的元组的第一个和第二个元素之间交替访问,因此单个迭代器的状态在元组中的两个元素之间前进.

在那之后,字典理解只是消耗这些对元组,因为它们扩展到k,v – 就像在任何其他字典理解中一样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读