gpt4 book ai didi

python - 在Python中 `0 is 0`是否总是 `True`?

转载 作者:行者123 更新时间:2023-12-03 16:15:30 26 4
gpt4 key购买 nike

Python 3.8(或CPython 3.8?)添加了警告

SyntaxWarning: "is" with a literal. Did you mean "=="?

用于代码 0 is 0

我了解警告,并且知道 is==之间的区别。

但是,我也知道CPython会为小整数缓存对象,并在其他情况下也共享它。
(出于好奇,我再次只是 checked the code( header)。
小整数存储在 tstate->interp->small_ints中。 01更加特殊,并且全局存储在 _PyLong_Zero_PyLong_One中。
所有 int的新创建都是通过 PyLong_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

VS:
def sum1b(*args):
y = 0
for x in args:
if y == 0:
y = x
else:
y = y + x
return y

VS:
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

VS:
def sum2(*args):
y = 0
for x in args:
y = y + x
return y

我有时会选择 sum1*而不是 sum2的原因是,取决于库, sum1*确实可以更有效。例如。如果参数是Numpy/TensorFlow/PyTorch数组,则您实际上将在此处保存一个(可能成本很高)的操作。

我更喜欢 sum1a而不是 sum1b的原因是 sum1b在某些输入上会中断。例如。如果输入是一个Numpy数组,则将不起作用。

当然,您可以使用 sum1c而不是 sum1a。但是, sum1a较短。所以这更好吗?

如果原始问题的答案是该方法始终有效,并且您同意 sum1a是最佳选择,那么您将如何摆脱警告呢?有没有简单的解决方法?通常,我可以看到该警告会很有用。所以我不想完全禁用它。我只想针对此特定语句禁用它。

也许我可以将其包装在一个函数中:
def is_(a, b):
return a is b

然后只需使用 if is_(y, 0): ...即可。这行得通吗?这是一个好主意吗?

最佳答案

不,不是。例如,Python的Rust implementation返回False:

>>>>> 0 is 0
False

虽然我希望在将来的版本中会有所改变,但这并没有错。

is 调用 id ,唯一的规定是返回的id对于给定对象是唯一且恒定的。数字的源代码表示形式(此处为 0)是否映射到不同的对象,这取决于实现的定义。

关于python - 在Python中 `0 is 0`是否总是 `True`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62175978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com