Почему ввод переменной (или выражения) выводит значение в стандартный вывод?

Возьмите этот пример:

>>> 5+10
15
>>> a = 5 + 10
>>> a
15

Как и почему Python делает это без явного оператора печати?

Если я делаю то же самое в ячейке IPython, на stdout будет напечатано только последнее такое значение:

In[1]: 5+10
       1

Out[1]: 1

Почему это происходит?

Ответ 1

Когда Python находится в "интерактивном" режиме, он допускает определенные поведения, которых он не имеет в неинтерактивном режиме. Например, sys.displayhook, изначально указанный в PEP 217.

Если значение не None, эта функция печатает его в sys.stdout и сохраняет в __builtin__._.

sys.displayhook вызывается в результате оценки выражения, введенного в интерактивном сеансе Python.

Вы можете изменить это поведение:

>>> import sys
>>> def shook(expr):
...   print(f'can haz {expr}?')
...
>>> sys.displayhook = shook
>>> 123
can haz 123?
>>> False
can haz False?
>>> None
can haz None?

И также установите его в нормальное состояние:

>>> sys.displayhook = sys.__displayhook__
>>> 3
3

В sys.displayhook Python по умолчанию sys.displayhook

>>> import sys;
>>> sys.displayhook
<built-in function displayhook>

но в IPython это

In [1]: import sys

In [2]: sys.displayhook
Out[2]: <IPython.terminal.prompts.RichPromptDisplayHook at 0x7f630717fa58>

Вот почему вы видите разное поведение между Python и IPython.

Ответ 2

Так работают все переводчики. Они не нуждаются в какой-либо print, но одна вещь, и без print они делают repr обо всем, и print не делает, например:

>>> 'blah'
'blah'
>>> print('blah')
blah
>>> 

Посмотрите на цитаты.

Также посмотрите это:

>>> print(repr('blah'))
'blah'
>>> 

repr делает то же самое.