我有一个Python程序,其中两个变量设置为该值'public'
.在条件表达式中,我的比较var1 is var2
失败了,但是如果我将其更改为var1 == var2
它则返回True
.
现在,如果我打开我的Python解释器并进行相同的"是"比较,它就会成功.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
在对这个问题的评论中,我看到了一个建议使用的声明
result is not None
Run Code Online (Sandbox Code Playgroud)
VS
result != None
Run Code Online (Sandbox Code Playgroud)
我想知道区别是什么,以及为什么可能推荐另一个?
该id()
内置功能使...
一个整数(或长整数),保证在该生命周期内该对象是唯一且常量的.
该is
操作,相反,给...
对象身份
那么,为什么有可能有具有相同的两个对象id
,但返回False
到is
检查?这是一个例子:
>>> class Test():
... def test():
... pass
>>> a = Test()
>>> b = Test()
>>> id(a.test) == id(b.test)
True
>>> a.test is b.test
False
Run Code Online (Sandbox Code Playgroud)
一个更令人不安的例子:(继续上述)
>>> b = a
>>> b is a
True
>>> b.test is a.test
False
>>> a.test is a.test
False
Run Code Online (Sandbox Code Playgroud)
然而:
>>> new_improved_test_method = lambda: None
>>> a.test = new_improved_test_method
>>> a.test is a.test
True
Run Code Online (Sandbox Code Playgroud) 我不清楚语法!=
和语法之间的区别is not
.他们似乎做了同样的事情:
>>> s = 'a'
>>> s != 'a'
False
>>> s is not 'a'
False
Run Code Online (Sandbox Code Playgroud)
但是,当我is not
在列表理解中使用时,它会产生与我使用时不同的结果!=
.
>>> s = "hello"
>>> [c for c in s if c is not 'o']
['h', 'e', 'l', 'l', 'o']
>>> [c for c in s if c != 'o']
['h', 'e', 'l', 'l']
Run Code Online (Sandbox Code Playgroud)
为什么o
get包含在第一个列表中,而不是第二个列表?
我(可能是错误的)认为is
运算符正在进行id()比较.
>>> x = 10
>>> y = 10
>>> id(x)
1815480092
>>> id(y)
1815480092
>>> x is y
True
Run Code Online (Sandbox Code Playgroud)
然而,val is not None
看起来它并不那么简单.
>>> id(not None)
2001680
>>> id(None)
2053536
>>> val = 10
>>> id(val)
1815480092
>>> val is not None
True
Run Code Online (Sandbox Code Playgroud)
然后,'是'运营商做了什么?它只是我推测的对象id比较吗?如果是这样,val is not None
在Python中被解释为not (val is None)
?
我很好奇Python中“x is not True”的优先级。起初,我认为它意味着“!= True”,但后来我认为“not True”肯定比“is not”具有更高的优先级。然而,以下内容似乎表明了后者:
>>> 4 is not True
True
>>> not True
False
>>> 4 is False
False
>>> 4 is (not True)
False
Run Code Online (Sandbox Code Playgroud)
看来Python将“is not True”解释为单个表达式,而不是相当于“is False”的“is (not True)”。
我对Python编程并不陌生,但之前也没有深入思考过这个问题。我可以安全地假设“is not”本身就是一个具有比“not True”更高的解析优先级的运算符吗?