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
中。
所有新创建的int
都是通过PyLong_FromLong
进行的,该函数首先检查是否为小整数并将其缓存。)
尽管存在这个更普遍的问题(我只是好奇),请考虑这个更具体的(示例)代码:
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
对比:
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数组,这将无法工作。当然,你可以使用
sum1c
代替sum1a
。然而,sum1a
更短。所以这更好吗?如果对于原始问题的答案应该始终有效,并且如果你同意
sum1a
是最佳选择,那么你如何消除警告呢?有没有简单的解决方法?通常情况下,我认为警告可能很有用。所以我不想完全禁用它。我只想为这个特定的语句禁用它。也许我可以把它封装在一个函数中:
def is_(a, b):
return a is b
然后只需使用if is_(y, 0): ...
。这样行吗?这是个好主意吗?
y == 0
不起作用。not y
也是如此。 - Albert0 is 0
(字面上的代码,而不是来自任意源的零)始终为真,因为两个零都是同一个编译代码对象的一部分,因此总是会被合并成一个单一的常量。 - jasonharper0
,这并不是错误的,只是愚蠢而已。 - Dimitris Fasarakis Hilliard