2015-02-11 2 views
1

Я тестирую некоторые функции Django в моей интерактивной оболочкеПочему понимание списка в моей интерактивной оболочке Python добавляет список Nones?

Вот моя попытка исследовать эти объекты, обратите внимание на список ноны в конце

>>> [print(foo) for foo in CharacterSkillLink.objects.all() if foo.speciality] 
Streetwise (Street Countdown) Roran 
[None] 

И с более ортодоксальным списком пониманием:

>>> [print(foo) for foo in range(1,10)] 
1 
2 
3 
4 
5 
6 
7 
8 
9 
[None, None, None, None, None, None, None, None, None] 

Девять нонов, все подряд.

Почему я получаю это?

+2

Поскольку 'print()' возвращает None –

+4

[Возможно ли использовать Pythonic для понимания списков только для побочных эффектов?] (Http://stackoverflow.com/questions/5753597/is-it-pythonic-to-use-list -comprehensions-for-just-side-effects) –

+0

Поскольку все уже сказали, почему это так, я буду намекать, как его напечатать: 'print ('\ n'.join ([str (foo) для foo в диапазоне (1,10)])) ' –

ответ

6

Потому что print возвращает значение, а именно None. То, что он печатает, и то, что он возвращает, - это две разные вещи.

1

Это связано с тем, что вы используете Python 3.x, в котором функция возвращает None после печати на консоль и, таким образом, вы получаете этот вывод. Принимая во внимание, что если вы использовали Python 2.x, вы правильно получите SyntaxError для функции печати.

Лучший пример будет это (в Python 2.x, как ваш пример не будет работать в Python 2.x)

>>> b = [] 
>>> [b.append(i) for i in range(10)] 
...[None, None, None, None, None, None, None, None, None, None] 
>>> print b 
...[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Если вы хотите печатать вещи и добавить его в список, он должен быть как это:

[(print(foo) or foo) for foo in CharacterSkillLink.objects.all() if foo.speciality] 

Однако, на мой взгляд, воздерживаться от использования таких вещей, как вещи могли бы получить уродливые после некоторого периода времени.

+0

Это уже не утверждение, теперь это функция. (Python 3) –

+0

My bad :-) изменит ответ, чтобы отразить это :-D – thiruvenkadam