Объект не повторяется, но становится повторяемым - PullRequest
3 голосов
/ 22 января 2012
>>> 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,)]

Извините за ужасный заголовок вопроса, но я не знаю, как его лучше сформулировать, потому что я полностью потерян.

Что здесь происходит?Почему он не повторяется в первоначальном понимании списка, но когда я повторяю его часть по отдельности, он становится повторяемым?

1 Ответ

4 голосов
/ 22 января 2012

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 s кортежей,который повторяется.

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