为什么dict.keys不能迭代?

时间:2015-07-24 23:29:53

标签: python

node_name是一个字符串。难道这不会返回node_list字典中的键列表,可以迭代吗?为什么错误说它不可迭代?

class Graph:

def __init__(self):
    self.node_list = {}
    self.number = 0

def node(self, node_name):
    if node_name in self.node_list.keys: 
    ...

File "PythonProject2.3.py", line 10, in node
    if node_name in self.node_list.keys: #returns list of keys
TypeError: argument of type 'builtin_function_or_method' is not iterable

3 个答案:

答案 0 :(得分:10)

.keys是一个函数,而不是属性。试试这个:

if node_name in self.node_list.keys():

默认情况下,字典会对其键进行迭代,因此这也可以使用:

if node_name in self.node_list:

答案 1 :(得分:0)

请更改

if node_name in self.node_list.keys(): 

if self.node_list.has_key(node_name):

答案 2 :(得分:0)

Python看到node_name in self.node_list.keys,因此它求self.node_list.keys的值,然后尝试计算出是否node_name是其结果。

self.node_list.keys是一个函数(您应该已经编写了keys()),但此处真正相关的是它不支持Python in运算符。也就是说,您无法测试self.node_list.keys中是否有东西。

您特别会发现有关迭代的错误的原因是,Python首先检查__contains__函数,如果不存在该函数,则尝试遍历in的右侧操作数,比较每个值使用==对左操作数。这将失败,因此您看到了异常。 Python这样做的原因仅仅是为了使任何支持迭代的事物也自动支持in。也许效率不是很高。