为什么键入变量(或表达式)会将值打印到stdout?

Cha*_*osh 17 python ipython python-interactive read-eval-print-loop

举个例子:

>>> 5+10
15
>>> a = 5 + 10
>>> a
15
Run Code Online (Sandbox Code Playgroud)

如果没有明确的print语句,Python如何以及为什么这样做?

如果我在IPython单元格中执行相同的操作,那么实际上只有最后一个这样的值以这种方式打印在stdout上:

In[1]: 5+10
       1

Out[1]: 1
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

koj*_*iro 35

当Python处于"交互"模式时,它会启用非交互模式下没有的某些行为.例如,sys.displayhook最初在PEP 217中指定.

如果value不是None,则此函数将其打印到sys.stdout,并将其保存__builtin__._.

在评估在交互式Python会话中输入的表达式的结果上调用sys.displayhook.

您可以修改此行为:

>>> 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?
Run Code Online (Sandbox Code Playgroud)

并将其恢复正常:

>>> sys.displayhook = sys.__displayhook__
>>> 3
3
Run Code Online (Sandbox Code Playgroud)

在默认的Python repl中,sys.displayhook

>>> import sys;
>>> sys.displayhook
<built-in function displayhook>
Run Code Online (Sandbox Code Playgroud)

但是在IPython中它是

In [1]: import sys

In [2]: sys.displayhook
Out[2]: <IPython.terminal.prompts.RichPromptDisplayHook at 0x7f630717fa58>
Run Code Online (Sandbox Code Playgroud)

这就是为什么你会看到Python和IPython之间的不同行为.