我创建了一个字典,其中包含索引和列表作为值。在尝试迭代类型列表的值时,它会出现这个错误:
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
对我来说有趣的是,所有这些测试都证明我并没有尝试迭代列表。 或者我做错了什么?
答案 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个元素的另一个列表),这将起作用。
你的第一个元素是一个整数,所以你不能从中解压缩任何东西。