【发布时间】:2020-11-18 00:27:32
【问题描述】:
我试图了解什么时候 python 实习生常量,什么时候不。我正在为这个问题使用 python 3.8.5。据我了解,在 python 3.7 之后,python 从 peephole 优化更改为 AST 优化器,并且更长的字符串现在被实习了。
我以为这一切都在我的掌控之中,直到我尝试在 jupyter notebook 和交互式解释器中运行相同的命令——在相同的 conda 环境和相同版本的 python 中。
>>> sys.version
'3.8.5 (default, Sep 4 2020, 02:22:02) \n[Clang 10.0.0 ]'
>>> "AvocadoAvocadoAvocadoAvocadoAvocado !" is "AvocadoAvocadoAvocadoAvocadoAvocado !"
<stdin>:1: SyntaxWarning: "is" with a literal. Did you mean "=="?
False
在 Jupyter Notebooks 中
import sys
sys.version
给予
'3.8.5 (default, Sep 4 2020, 02:22:02) \n[Clang 10.0.0 ]'
"AvocadoAvocadoAvocadoAvocadoAvocado !" is "AvocadoAvocadoAvocadoAvocadoAvocado !"
给予
<>:1: SyntaxWarning: "is" with a literal. Did you mean "=="?
<>:1: SyntaxWarning: "is" with a literal. Did you mean "=="?
<ipython-input-6-2414f185945a>:1: SyntaxWarning: "is" with a literal. Did you mean "=="?
"AvocadoAvocadoAvocadoAvocadoAvocado !" is "AvocadoAvocadoAvocadoAvocadoAvocado !"
True
我无法弄清楚为什么解释器中的结果为 False 而笔记本中的结果为 True。我还想知道为什么笔记本中有三个警告,而解释器中只有一个,这是否包含导致结果不同的任何线索。
为什么我在交互式解释器中得到 False 而在 Jupyter Notebooks 中得到 True?
【问题讨论】:
-
@Boris。我完全理解这一点,以及实习在 Jupyter Notebooks 中的工作原理以及如何强制静态值被实习。我不明白为什么同一个命令在解释器和 Jupyter Notebooks 中的行为不同。
-
我无法在 3.8.2 中重现此行为。如果字符串确实相等,即使字符串相当长(超过 200 个字符),我也会得到
True。 -
This 看起来很可能是 ipython 不同结果的答案(基本上归结为在优化器达到成为PyObject)