2012-01-22 51 views
3
>>> carls = [c.source.out_crushes.all().select_related().values_list('target') for c in similar_crushes] 
>>> [carlid for carlid in c for c in carls] 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
TypeError: 'Crush' object is not iterable 
>>> for c in carls: 
... pass 
... 
>>> [carlid for carlid in c for c in carls] 
[(1,), (1,), (3,), (3,)] 

对不起,问题的标题,但我不知道如何更好地措词,因为我完全失去了。对象是不可迭代的,但变得迭代

这是怎么回事吗?为什么在初始列表理解中不能迭代,但是当我单独迭代其中的一部分时,它就变得可迭代了?

回答

4

carls看起来应该是列表的列表,像[[(1,), (2,), (3,)], [(1,), (2,)]]

当你做[carlid for carlid in c for c in carls]您要遍历的c最后定义的值,它本来是一个Crush对象从similar_crushes

当您做for c in carls:时,您将c重新定义为carls列表中的最后一个元素,该列表是可迭代的PK的元组列表。

for i in range(100): 
    pass 
print i 
# out : 99