Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python如何在交互式解释器与jupyter笔记本中实习字符串_Python_Jupyter Notebook - Fatal编程技术网

python如何在交互式解释器与jupyter笔记本中实习字符串

python如何在交互式解释器与jupyter笔记本中实习字符串,python,jupyter-notebook,Python,Jupyter Notebook,我试图理解python何时使用常量,何时不使用常量。对于这个问题,我使用的是python 3.8.5。我了解到,在Python3.7之后,python从窥视孔优化更改为AST优化器,并且更长的字符串现在被插入 我以为这一切都在我的控制之下,直到我尝试在同一个conda环境和同一版本的python中在jupyter笔记本和交互式解释器中运行相同的命令 >>> sys.version '3.8.5 (default, Sep 4 2020, 02:22:02) \n[Clang

我试图理解python何时使用常量,何时不使用常量。对于这个问题,我使用的是python 3.8.5。我了解到,在Python3.7之后,python从窥视孔优化更改为AST优化器,并且更长的字符串现在被插入

我以为这一切都在我的控制之下,直到我尝试在同一个conda环境和同一版本的python中在jupyter笔记本和交互式解释器中运行相同的命令

>>> 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
给予

给予

:1:SyntaxWarning:“is”带有文字。你是说“==”?
:1:SyntaxWarning:“是”带有文字。你是说“==”?
:1:SyntaxWarning:“是”带有文字。你是说“==”?
“AvocadoAvocadoAvocadoAvocadoAvocado!”是“AvocadoAvocadoAvocadoAvocadoAvocado!”
真的
我不明白为什么翻译的结果是假的,笔记本上的结果是真的。我还想知道为什么笔记本上有三个警告,而口译员只有一个警告,这是否有任何线索可以解释为什么结果不同


为什么我在交互式解释器中得到False,而在Jupyter笔记本中得到True?

python(和其他语言)中有许多东西看起来似乎可以工作,但与它们应该如何工作的定义背道而驰。对象标识就是其中之一。
is
关键字的目的决不是比较某个对象的值,而是测试两个变量是否引用相同的基础对象。如果它们是同一个对象,那么值也必须相等,这似乎是有道理的,但反过来说,这句话根本不是真的。这有时可以在不引发异常的情况下工作(正如您所发现的),但是它不是python的一个定义特性。这些都是“依赖于实现的”,永远不能保证给出正确甚至稳定的结果

显然,ipython不会以通过内置REPL提交的方式向cpython二进制文件提交代码块:

我假设这是为了减少前端在发送多行代码时必须发送到内核的消息数量。在这方面,我希望从命令行执行.py文件的行为能够更好地匹配您从ipython获得的结果


沿着这些思路,有时可以在删除后但在垃圾收集之前恢复对象,因为
id
函数的实现返回对象的内存位置,该位置可与
ctypes
一起使用,以构造新的
PyObject
。这在很大程度上是一种在代码中引入bug和不稳定性的方法。如果由于某种原因,
id
被切换到每个分配项的简单计数器(可能您想防止泄漏有关进程内存空间的任何信息),则会立即中断。

请参阅或@Boris。我完全理解这一点,以及在Jupyter笔记本电脑中如何进行实习,以及如何强制实习静态值。我不明白的是,为什么同一个命令在解释器和Jupyter笔记本中的行为不同。我无法用3.8.2重现这种行为。如果字符串确实相等,则即使使用相当长的字符串(超过200个字符),我也会得到
True
。看起来很可能是ipython的不同结果的答案(基本上归结为在优化器成为PyObject之前一次向优化器发送多少代码),issue link掌握了答案。谢谢你找到那个!
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