当前位置: 首页 > 面试题库 >

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

周宏胜
2023-03-14
问题内容

举个例子:

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

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

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

In[1]: 5+10
       1

Out[1]: 1

为什么会这样?


问题答案:

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

如果value不为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

在默认的Python repl中,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之间行为不同的原因。



 类似资料:
  • 上面的片段结果是x=1,y=10,z=3,请解释这段代码。提前致谢

  • 问题内容: 我有以下代码 我知道根据JLS,只允许将常量表达式作为批注属性的值。但为什么?如果数据类型匹配,为什么还不够?如果要在运行时对表达式进行求值,是否有可能出错?每个规范背后都有逻辑推理吗? 问题答案: 注释就像类型扩展或有关该类型的元数据。 因为Java是一种静态类型的语言(意味着类型在编译时是已知的),所以在编译时也知道注释属性数据(元数据)似乎是合理的- 您正在定义/声明有关注释(扩

  • /* main.c */ extern void print_var_1(void); extern void print_var_2(void); int main(void) { print_var_1(); print_var_2(); return 0; } /* static-1.c */ #include <stdio.h> static int var = 1;

  • PEP 572引入了为Python 3.8实现的赋值表达式(俗称Walrus操作符)。这似乎是一个非常重要的新特性,因为它将允许在理解和lambda函数中进行这种形式的赋值。 赋值表达式的语法、语义学和语法规范到底是什么? 为什么在PEP 379中关于“添加赋值表达式”的类似想法之前遭到拒绝的情况下,引入了这个新的(似乎相当激进的概念)?

  • 在以下代码中(在本地和Wandbox上测试): MSVC 15.8.5编译失败: (全部指包含的行) Clang 8(HEAD)报告: gcc 9(负责人)报告: 为什么? 首先,它们显然都认为enum-id是非常数,尽管它们显然实际上是众所周知的编译时常数值。 其次,MSVC抱怨读取超出生存期,但的生存期及其值应在中的整个使用过程中延长。 第三,gcc有一个奇怪的const-vs非const抱怨