Почему понимание списка в моей оболочке Python Interactive добавляет список Nones?

Я тестирую некоторые функциональные возможности Django в моей интерактивной оболочке

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

>>> [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, Что он печатает и что возвращает, это две разные вещи.

Это потому, что вы используете 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]

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

Другие вопросы по тегам