python3中字典的keys_迭代Python 3中的字典项(),values(),keys()

我不知道这是否是对你的问题的答案,但希望它解释了一点关于Python 2和3在这方面的区别。

在Python 2中,iter(d.keys())和d.iterkeys()不完全等同,尽管它们的行为相同。在第一个,keys()将返回字典的键列表的副本,然后iter将返回一个迭代器对象在此列表,第二个完整的键列表的副本永远不会被构建。

Python 3中d.keys()返回的视图对象是可迭代的(即可以从中创建一个迭代器),所以当你在d.keys()中为k指定时,Python会为你创建迭代器。因此,你的两个例子将表现相同。

更改keys()的返回类型的重要性是Python 3视图对象是动态的。即如果我们说ks = d.keys()并且稍后添加到d,则ks将反映这一点。在Python 2中,keys()返回当前在dict中的所有键的列表。比较:

Python 3

>>> d = { "first" : 1, "second" : 2 }

>>> ks = d.keys()

>>> ks

dict_keys(['second', 'first'])

>>> d["third"] = 3

>>> ks

dict_keys(['second', 'third', 'first'])

Python 2.x

>>> d = { "first" : 1, "second" : 2 }

>>> ks = d.keys()

>>> ks

['second', 'first']

>>> d["third"] = 3

>>> ks

['second', 'first']

由于Python 3的keys()返回动态对象,Python 3没有(并且不需要)单独的iterkeys方法。

进一步澄清

在Python 3中,keys()返回一个dict_keys对象,但是如果我们在for循环上下文中使用它在d.keys()中的k,则隐式创建一个迭代器。因此,d.keys()中的k和iter(d.keys())中的k之间的差异是迭代器的隐式和显式创建之一。

在另一个区别,虽然他们都是动态的,请记住,如果我们创建一个显式迭代器,那么它只能使用一次,而视图可以根据需要重用。例如

>>> ks = d.keys()

>>> 'first' in ks

True

>>> 'second' in ks

True

>>> i = iter(d.keys())

>>> 'first' in i

True

>>> 'second' in i

False # because we've already reached the end of the iterator

另外,请注意,如果我们创建一个显式迭代器,然后修改dict,则迭代器无效:

>>> i2 = iter(d.keys())

>>> d['fourth'] = 4

>>> for k in i2: print(k)

...

Traceback (most recent call last):

File "", line 1, in

RuntimeError: dictionary changed size during iteration

在Python 2中,给定键的现有行为,需要一个单独的方法来提供一种迭代方法,而不复制键列表,同时仍保持向后兼容性。因此iterkeys()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值