Python разница в понимании списка результатов - PullRequest
0 голосов
/ 15 января 2020

Я работал над списками в python 3. Когда я столкнулся с этим поведением, которое я не понимаю. Будем рады узнать от кого-то, почему это происходит.

>>> chess_board = [[(i,j) if(i not in (0,7) and j not in (0,7)) else '—-' for i in range(8)] for j in range(8)]
>>> # **behavior 1** : using for loop to print
>>> for row in chess_board:
...     print(row)
...
['—-', '—-', '—-', '—-', '—-', '—-', '—-', '—-']
['—-', (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), '—-']
['—-', (1, 2), (2, 2), (3, 2), (4, 2), (5, 2), (6, 2), '—-']
['—-', (1, 3), (2, 3), (3, 3), (4, 3), (5, 3), (6, 3), '—-']
['—-', (1, 4), (2, 4), (3, 4), (4, 4), (5, 4), (6, 4), '—-']
['—-', (1, 5), (2, 5), (3, 5), (4, 5), (5, 5), (6, 5), '—-']
['—-', (1, 6), (2, 6), (3, 6), (4, 6), (5, 6), (6, 6), '—-']
['—-', '—-', '—-', '—-', '—-', '—-', '—-', '—-']
>>> # **behavior 2** using list comprehension
>>> [print(row) for row in chess_board]
['—-', '—-', '—-', '—-', '—-', '—-', '—-', '—-']
['—-', (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), '—-']
['—-', (1, 2), (2, 2), (3, 2), (4, 2), (5, 2), (6, 2), '—-']
['—-', (1, 3), (2, 3), (3, 3), (4, 3), (5, 3), (6, 3), '—-']
['—-', (1, 4), (2, 4), (3, 4), (4, 4), (5, 4), (6, 4), '—-']
['—-', (1, 5), (2, 5), (3, 5), (4, 5), (5, 5), (6, 5), '—-']
['—-', (1, 6), (2, 6), (3, 6), (4, 6), (5, 6), (6, 6), '—-']
['—-', '—-', '—-', '—-', '—-', '—-', '—-', '—-']
[None, None, None, None, None, None, None, None]
>>>

Почему есть печать строк [Нет, Нет, Нет, Нет, Нет, Нет, Нет, Нет, Нет, Нет] при печати с использованием списка?

Ответы [ 2 ]

5 голосов
/ 15 января 2020

1 / список пониманий ([something for item in iterable]) дает list.

2 / print() возвращает None.

3 / Ваша оболочка Python всегда печатает результат последнего выражения, которое было оценено.

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

FWIW, списки не должны использоваться для побочных эффектов - это пустая трата ресурсов, и это не помогает с удобочитаемостью.

1 голос
/ 15 января 2020

Привет и добро пожаловать в Stackoverflow.

print() является функцией и возвращает None. Понимание списка - это создание списка.

Вы создаете список, вызывая print() для каждого элемента в chess_board.

Побочным эффектом print() является запись строки в стандартный вывод, и повторный вызов ее в понимании списка заставляет распечатать все строки.

В конце концов, ваше выражение возвращает список с None s.

Так как вы выполняете это в интерактивной оболочке, результаты выражений также распечатываются:

>>> 1
1
>>> 1+1
2
>>> [a+1 for a in range(5)]
[1, 2, 3, 4, 5]
>>> [print(a+1) for a in range(5)]
1
2
3
4
5
[None, None, None, None, None]
>>> 

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

...