【问题标题】:Check a value is exactly 0? [duplicate]检查一个值是否正好是 0? [复制]
【发布时间】:2020-04-24 13:28:35
【问题描述】:

我想检查一个值s是否正好为零,但是当s = Falses == 0也为真。那么如何解决这种情况?
提前致谢!

【问题讨论】:

  • False is 在 Python 中数字“完全为零”。您需要更清楚地了解您想要实现的目标,然后我们才能告诉您如何实现它。
  • 如果 var 's' 等于 0,s = False,......在什么情况下您需要帮助
  • 为什么您试图将False 与其他零值区分开来?您的函数是否接受参数并以不同方式处理布尔值和其他数字类型?如果是这样,您可以先检查布尔值并将数字处理放在elif 子句中(但也许您应该重新设计函数的参数)。你不知道布尔值是 Python 中的数字吗?在这种情况下,也许您应该只使用 == 0 并将 False 视为 0。您是否只是在处理应该始终是数字的值时过于防御?如果是这样,也许您根本不需要处理布尔大小写。
  • 为什么要这样做的详细信息对于确定正确的方法应该是至关重要的。如果没有更多信息,我们提出的任何“正确答案”或“如何做”都可能只是隐藏问题,让事情更难解决。

标签: python


【解决方案1】:

也许有点冗长,但你也可以检查它不是False

>>> s = False
>>> s == 0 and s is not False
False
>>> s = 0
>>> s == 0 and s is not False
True

is not 在这里工作,因为 TrueFalse 是单例。

【讨论】:

  • False 保证是单例吗?它是 Python C API 中的一个宏/有效全局,但我无法找到该语言在理论上是否也是这种情况。
  • @viraptor 是的,它是一种语言保证单例,这是检查的常用习语
  • @juanpa.arrivillaga 我希望有一个链接来参考定义的地方。内置常量的引用并没有明确说明这一点,例如:docs.python.org/3/library/constants.html
  • @viraptor here's a link to the docs "代表 False 和 True 值的两个对象是唯一的布尔对象。"
  • 警告:s == 0 可能适用于其他类型,例如具有自定义__eq__的对象
【解决方案2】:

不要使用s is 0 来检查 equls 是否为 0,因为 0 不能保证是单例。

如果您需要它同时适用于 int 0 和 float 0.0,请尝试以下操作:

type(s) in (float,int) and s ==0

【讨论】:

  • s is 0 仅因为 cPython 中特定的小整数缓存效果而起作用。对于一般的 Python 代码,不应依赖它。
  • 0 不是一种语言保证单例,事实上,它并不总是保证在 CPython 中以这种方式工作(奇怪,深奥的边缘情况,但它们存在,请参阅 stackoverflow.com/questions/21456318/…
猜你喜欢
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2018-05-09
  • 2015-09-15
  • 1970-01-01
相关资源
最近更新 更多