【问题标题】:Different results in IDLE and python shell using 'is'使用“is”在 IDLE 和 python shell 中产生不同的结果
【发布时间】:2021-07-20 13:12:05
【问题描述】:

我正在探索python is vs ==,在探索它的时候,我发现我是否写了以下内容;

>>> a = 10.24
>>> b = 10.24

在python shell中输入>> a is b,它给我的输出是假的。但是当我在 python 编辑器中编写以下代码并运行它时,我得到了正确的结果。

a = 10.24
b = 10.24
print(a is b)

谁能解释为什么我会得到相同变量和表达式的两个不同结果?

【问题讨论】:

  • 这是完全不同的情况;在 shell 中,您键入的每一行都是单独编译的,但是一个脚本是一次编译的 - 允许编译器注意到您已经使用了两次相同的常量。请注意,语言实际上并不能保证这两种行为,如果您依赖它,那么您的代码就会被破坏。
  • @jasonharper python 不是编译语言,所以我不太明白你的答案......你能进一步解释一下你的意思吗?这很奇怪,因为对整数(例如:10)进行的相同实验在 shell 和文件脚本中都给出了 True
  • @MatteoZanoni 查看我的回答,了解为什么会发生这种情况。 Python 将 [-5,256] 之间的整数缓存为单例,因此对于 a is b 语句,该范围内的任何整数都将返回 true。另见What's with the integer cache maintained by the interpreter?
  • 'is' 有两个预期用途。 1. 在“==”不够具体的不常见情况下进行比较。其中最常见的是x is Nonex is not None。 2. 测试特定于实现的内部细节。 Python 测试套件有一些,它们被标记为 CPython-only 测试。有一个用于 CPython 特定的整数缓存。

标签: python python-idle


【解决方案1】:

should not rely on is 用于比较值时要测试相等性。

is 关键字比较变量的 id,并检查它们是否是同一个对象。这仅适用于 Python 中的整数范围 [-5,256],因为它们是单例(这些值被缓存和引用,而不是将值存储在内存中)。见What's with the integer cache maintained by the interpreter? 这与检查它们是否相同的值不同。

为什么它在 REPL 环境中的行为与传递的脚本不同,请参阅Different behavior in python script and python idle?。它的要点是传递的脚本首先解析整个文件,而像 ipython 或 IDLE shell 这样的 REPL 环境一次读取一行。 a=10.24b=10.24 在不同的上下文中执行,所以 shell 不知道它们应该是相同的值。

【讨论】:

  • 非常有帮助的解释。这是典型的奇怪行为,会让你对 python 的内部工作原理有更多的了解。我今天肯定学到了一些东西
【解决方案2】:

在 python 编辑器中

a = 10.24
b = 10.24
print(id(a),id(b))

输出 -

2079062604112 2079062604112

如果我们把它和C联系起来,那么20790626041122079062604112实际上是内存地址,在Python中是唯一的id,在python编辑器中是一样的。

在外壳中-

>>> a = 10.24
>>> b = 10.24
>>> id(a)
2254043146288 # output
>>> id(b)
2254043400016 # output

提供不同的唯一 ID。
因此,当is 用于比较时,它会比较unique id's,这就是您得到不同答案的原因。
希望对您有所帮助。

【讨论】:

  • 毫无疑问是地址的关键字检查。但是为什么它在 shell 和编辑器中的行为不同
  • towardsdatascience.com/python-memory-and-objects-e7bec4a2845这篇文章将消除你对is,==basics of Python and memory management的所有疑惑,我在这里发现的是python是使用名为'Interning'的过程来优化内存分配这是你问题的根本原因。
  • 我读过那篇文章。我确实了解实习的概念。但我的问题仍然是为什么实习在 shell 和编辑器上表现不同。在 shell 和编辑器上,相同的语句有 2 个不同的答案
猜你喜欢
  • 2016-08-28
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多