为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中,“0 is 0”总是“True”吗?

在 Python 中,“0 is 0”总是“True”吗?

犯罪嫌疑人X 2022-12-20 12:31:44
Python 3.8(或 CPython 3.8?)添加了警告SyntaxWarning: "is" with a literal. Did you mean "=="?对于代码0 is 0。is我理解警告,并且知道和之间的区别==。但是,我也知道 CPython 缓存小整数的对象并在其他情况下共享它。(出于好奇,我只是再次检查了代码(header)。小整数缓存在tstate->interp->small_ints. 中0,1甚至更特殊,全局存储在_PyLong_Zero和中_PyLong_One。所有新创建的ints 都是 viaPyLong_FromLong并且首先检查它是否是一个小整数整数和缓存。)鉴于这种背景,如果你知道你有一个int对象,你可以说支票x is 0应该是安全的,对吧?另外,您可以推导出它0 is 0应该始终是True,对吗?或者这是 CPython 的一个实现细节,而其他解释器不遵循这个?哪个解释器不遵循这个?尽管有这个更通用的问题(我只是好奇),请考虑这个更具体的(示例)代码:def sum1a(*args):    y = 0    for x in args:        if y is 0:            y = x        else:            y = y + x    return y对比:def sum1b(*args):    y = 0    for x in args:        if y == 0:            y = x        else:            y = y + x    return y对比:def sum1c(*args):    y = None    for x in args:        if y is None:            y = x        else:            y = y + x    if y is None:        return 0    return y对比:def sum2(*args):    y = 0    for x in args:        y = y + x    return y我有时更喜欢的原因sum1*是sum2,根据图书馆的不同,sum1*确实可以更有效率。例如,如果参数是一个 Numpy/TensorFlow/PyTorch 数组,你真的会在这里保存一个(可能代价高昂的)操作。我更喜欢的原因sum1a是sum1b这sum1b会破坏某些输入。例如,如果输入是一个 Numpy 数组,这将不起作用。当然,你可以使用sum1cinstead of sum1a。但是,sum1a更短。所以这个更好?如果原始问题的答案是这应该始终有效,并且如果您同意这sum1a是最好的选择,那么您将如何摆脱警告?有简单的解决方法吗?总的来说,我可以看到警告是有用的。所以我不想完全禁用它。我只想为此特定语句禁用它。也许我可以将它包装在一个函数中:def is_(a, b):     return a is b然后只需使用if is_(y, 0): .... 这行得通吗?这是一个好主意吗?
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

不,不是。举例来说,Python的Rust 实现返回False

>>>>> 0 is 0
False

这并没有错,尽管我希望这会在未来的版本中发生变化(它已经发生了!)。

iscalls idwho 唯一的规定是返回的 id 对于给定对象是唯一且不变的。数字(此处)的源代码表示是否0映射到不同的对象取决于实现来定义。


查看完整回答
反对 回复 2022-12-20
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信