【问题标题】:an irregular anomaly in python tuplepython 元组中的不规则异常
【发布时间】:2019-01-07 08:57:48
【问题描述】:

我创建了两个相同的元组并在它们上使用 is 运算符,应该得到的答案是错误的,但是当我在 vscode/atom/notepadd++ 中使用它时它会实现,但是当我在 pthon 中使用相同的代码通过 cmd 运行时它会变成错误

a = (1,2,3)
b = (1,2,3)

print(a is b)

实际结果应该是错误的,当我通过 cmd 或一些在线 python 编译器使用 python 时它是错误的,但是当我使用 vscode 编写上述代码并创建一个 .py 文件时它实现了。下图是我想说的。

我在 vscode 中的代码通过终端直接在终端中执行:

【问题讨论】:

  • CPython 默认不承诺实习不可变对象(字符串/元组),但实际上,Python 代码库中的很多地方确实重用了已创建的对象。这就是如果您检查这些小对象的 id 是否相同的原因。
  • IDE 正在使用哪个 Python?你自己用的是同一个吗?由于整数元组是完全不可变的,我可以看到其他版本的 Python 对对象进行了实习,导致它们具有相同的 id。不过,我不希望 CPython 出现这种情况——在您拍摄的图片中查看版本字符串的其余部分会很有帮助。
  • 例如,PyPy 将实习元组,至少在针对脚本而不是交互运行时。
  • 我使用的是 python 3.7。当代码用 ide 编写但使用终端执行时
  • 看起来这是 Python 3.7 的一个新特性,因为 some work 在 AST 级常量折叠(因为数字元组实际上只是一个常量)和 some work 在窥视孔优化器。

标签: python python-3.x


【解决方案1】:

我在 linux 终端检查它的结果是 False。这是因为当 a 和 b 指向同一个对象时,a is b 将变为 True。 is 不比较元组的值。如果您定义b=a,那么您将得到 True。你可以查看这个讨论Python "is" statement: what is happening?

【讨论】:

  • 这不是这里发生的事情——正在创建两个单独的元组。 OP 期望 id 不同,但在一种情况下它们不是。
  • 我在python终端和用记事本编写的运行代码中都检查了它。结果总是错误的。
  • 这意味着我们可能遗漏了一条信息,而不是他将a 分配给b。例如,使用 pypy 你可以得到这个结果。 PyPy 可以对整数元组进行实习,因为一切都是不可变的,就像 CPython 对字符串所做的那样。 :-)
  • user10340258 你用过元组吗?我用的是 python 3.7
  • 我只写了你写的3行,使用python 2.7.13。
【解决方案2】:

这是Python 3.7.0 alpha 4 中由更改bpo-29469: Move constant folding from bytecode layer to AST layer. 引入的更改

我们看到命令行 (REPL) 和脚本之间的不同行为。在命令行输入的每一行在输入时都会被编译和执行。一次编译所有脚本。

一般来说,对于普通比较,您应该使用等号运算符 (==) 而不是恒等运算符 (is)。对于所有对象,相等运算符都有多种完成比较的策略(实际上每个类都可以提供自己的__eq__ 运算符)。身份运算符只会比较对象的 id。

【讨论】:

  • 要确认任何python版本的这种行为,在python交互式提示符下,在一行输入a=(1,2,3); b=(1,2,3); print(a is b)
  • 哇,我的意思是你太棒了,非常感谢你的帮助,我刚刚被困在另一件事上,就像这样,你节省了我的时间。通常只有一件事,整个脚本一次编译,命令行用于教学目的。哪个是正确的命令行或整个脚本??
  • so @Doug Henderson 每一行都处于空闲状态 >>> 表示这将是 1 个脚本,下一个 >>> 将是另一个脚本
猜你喜欢
  • 2020-11-18
  • 1970-01-01
  • 2011-10-19
  • 2012-02-08
  • 1970-01-01
  • 2012-01-03
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多