迭代类型列表的字典值得到我TypeError:'int'对象不可迭代

时间:2015-05-25 09:27:24

标签: python dictionary

我创建了一个字典,其中包含索引和列表作为值。在尝试迭代类型列表的值时,它会出现这个错误:

Traceback (most recent call last):
  File "C:\Python27\PyScripts\TextAdventure\InputModule.py", line 112, in <module>
    Inputs.update()
  File "C:\Python27\PyScripts\TextAdventure\InputModule.py", line 85, in update
    for priority, conditionals, function, args, kwargs in self.event_hooks[event.type]:
TypeError: 'int' object is not iterable

这是具有相关功能的课程:

class InputManager(object):

    def hook(self, event_type, function, priority = -1, conditionals = [], *args, **kwargs):
        if not event_type in self.tracked_events:
            self.tracked_events.append(event_type)
        self.event_hooks[event_type] = [priority, conditionals, function, args, kwargs]

    def update(self):
        events = self.event_loop()

        to_call = {}
        for event in events:

            ## random test
            print "Dictionary:\n", self.event_hooks
            print "Index of dictionary:", event.type
            print "Value:\n", self.event_hooks[event.type]
            print "Value type:", type(self.event_hooks[event.type])
            print "Generated list:\n", [i for i in self.event_hooks[event.type]]
            print "Value list equality:", self.event_hooks[event.type] == [i for i in self.event_hooks[event.type]]
            ##

            for priority, conditionals, function, args, kwargs in self.event_hooks[event.type]:

                if conditionals and self.check_conditionals(event, conditionals):
                    to_call[priority] = to_call.get(priority, [])
                    to_call[priority].append([function, args, kwargs])

Inputs = InputManager()
Inputs.hook(pygame.MOUSEBUTTONUP, Inputs.terminate)
Inputs.update()

现在,正如您所看到的,我已经进行了一些随机测试以了解发生了什么。

从结果中,我可以得出的结论是,我试图迭代的对象绝对不是int,而是列表。 他们在这里:

Dictionary:
{6: [-1, [], <bound method InputManager.terminate of <__main__.InputManager object at 0x02A7BEB0>>, (), {}]}
Index of dictionary: 6
Value:
[-1, [], <bound method InputManager.terminate of <__main__.InputManager object at 0x02A7BEB0>>, (), {}]
Value type: <type 'list'>
Generated list:
[-1, [], <bound method InputManager.terminate of <__main__.InputManager object at 0x02A7BEB0>>, (), {}]
Value list equality: True

对我来说有趣的是,所有这些测试都证明我并没有尝试迭代列表。 或者我做错了什么?

2 个答案:

答案 0 :(得分:3)

你基本上是在做像

这样的事情
for a, b, c, d, e in [1, 2, 3, 4, 5]:
    ...

在循环的第一个过程中,您得到的值为1,然后您尝试将其分配给a,b,c,d,e

您循环遍历列表中的每个项目,然后尝试将其解压缩为多个变量。 列表中的第一项是整数([-1, [], <bound method ...),您可以尝试将其解压缩到priority, conditionals, function, args, kwargs。 但是你不能遍历整数。

看起来你可能只是想这样做:

priority, conditionals, function, args, kwargs = self.event_hooks[event.type]

答案 1 :(得分:1)

你在这里想做什么:

for priority, conditionals, function, args, kwargs in self.event_hooks[event.type]:

是在dictionarty event.type的键event_hooks中从列表的每个元素中取出5个元素

如果该列表的每个元素都是可迭代的(例如,恰好5个元素的另一个列表),这将起作用。

你的第一个元素是一个整数,所以你不能从中解压缩任何东西。