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

'is'运算符在浮点数时表现异常

周翰池
2023-03-14
问题内容

单元测试模块时遇到一个令人困惑的问题。该模块实际上是在转换值,我想比较这些值。

==和之间存在差异is(部分,我谨防差异)

>>> 0.0 is 0.0
True   # as expected
>>> float(0.0) is 0.0
True   # as expected

到现在为止,这是我的“问题”:

>>> float(0) is 0.0
False
>>> float(0) is float(0)
False

为什么?至少最后一个让我很困惑。的内部表示float(0)float(0.0)应该相等。与的比较==按预期进行。


问题答案:

这与is工作方式有关。它检查引用而不是值。True如果将任何一个参数分配给相同的对象,则返回。

在这种情况下,它们是不同的实例。float(0)并且float(0)具有相同的值==,但就Python而言是不同的实体。CPython实现还将该整数缓存为该范围内的单例对象->
[x | x∈∧-5≤x≤256]

>>> 0.0 is 0.0
True
>>> float(0) is float(0)  # Not the same reference, unique instances.
False

在此示例中,我们可以演示整数 缓存原理

>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False

现在,如果float()将float传递给,则只需返回float文字( 短路
),就像使用相同的引用一样,因为不需要从现有的float实例化新的float:

>>> 0.0 is 0.0
True
>>> float(0.0) is float(0.0)
True

这可以通过以下方式进一步证明int()

>>> int(256.0) is int(256.0)  # Same reference, cached.
True
>>> int(257.0) is int(257.0)  # Different references are returned, not cached.
False
>>> 257 is 257  # Same reference.
True
>>> 257.0 is 257.0  # Same reference. As @Martijn Pieters pointed out.
True

但是,的结果is也取决于它在其中执行的范围( 超出此问题/解释的范围 ),请向用户咨询: @
Jim
对代码对象的出色解释。甚至python的文档也包含有关此行​​为的部分:

  • 5.9比较

[7]
由于自动进行垃圾回收,释放列表以及描述符的动态性质,您可能会注意到在某些is运算符用法中,似乎存在异常行为,例如涉及实例方法或常量之间比较的行为。查看他们的文档以获取更多信息。



 类似资料:
  • 我阅读关于浮点和舍入在浮点算术期间发生的错误。 我读了很多关于IEEE754单精度/双精度格式的文章。我知道有符号位、8(或)11位指数和23(或)52位有效位以及隐式前导位。 我也知道分母不是质因数2的实数不能完全表示,例如二进制中的0.1是0.0001100110011...... 我知道0.1 0.1 0.1不等于0.3,因为舍入误差的累积。 同样,0.5也可以用二进制格式表示,因为它是1/

  • 问题内容: 为什么以下代码在Python中表现异常? 我正在使用Python 2.5.2。尝试使用某些不同版本的Python,Python 2.3.3似乎在99到100之间显示了上述行为。 基于以上所述,我可以假设Python是内部实现的,因此“小”整数的存储方式与大整数的存储方式不同,并且is运算符可以分辨出这种差异。为什么要泄漏抽象?当我事先不知道它们是否为数字时,比较两个任意对象以查看它们是

  • 本文向大家介绍DSP中浮点转定点运算--定点数模拟浮点数运算及常见的策略,包括了DSP中浮点转定点运算--定点数模拟浮点数运算及常见的策略的使用技巧和注意事项,需要的朋友参考一下 4.定点数模拟浮点数运算及常见的策略   相信大家到现在已经大致明白了浮点数转换成定点数运算的概貌。其实,原理讲起来很简单,真正应用到实际的项目中,可能会遇到各种各样的问题。具我的经验,常见的策略有如下几条: 1)除法转

  • 问题内容: 我注意到我可以使用运算符比较所有本机数据类型(整数,字符串,布尔值,浮点数等),还可以比较包含本机数据类型的列表,元组,集合和字典。在这些情况下,操作员将检查两个对象是否相等。但是在某些其他情况下(试图比较我创建的类的实例),该运算符只是检查两个变量是否引用同一对象(因此在这些情况下,该运算符等效于该运算符) 我的问题是:什么时候操作员不只是比较身份? 编辑:我正在使用Python 3

  • 问题内容: 在使用Python解释器时,我偶然发现了与运算符有关的这种冲突情况: 如果评估在函数中进行,则返回,如果在外部进行,则返回。 由于运营商评估的参与对象,这意味着和指向同一个声明的函数内时的实例,但是,相反,它们指向一个不同的对象在它之外时。 为什么会这样呢? 注意 :我了解Identity()和equal()操作之间的区别,如了解Python的“ is”运算符所述。此外,我还知道pyt

  • 本文向大家介绍C#浮点数的表示和基本运算,包括了C#浮点数的表示和基本运算的使用技巧和注意事项,需要的朋友参考一下 1 浮点数的表示 通常,我们可以用下面的格式来表示浮点数 S P M 其中S是符号位,P是阶码,M是尾数 对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 S P M 表示公式 偏移量 1