我看到了这个问题here,现在我很好奇。与JS中的===符号相比,is
运算符在python中的行为如何?
答案 0 :(得分:7)
is
检查两个对象在Python中是否具有相同的id
,即。即使在记忆中,它们也是一样的。您可以检查的是:
>>> a='foo'
>>> a is 'foo'
True
>>> id(a)
44434088
>>> id('foo')
44434088
>>> a=[1]
>>> a is [1]
False
>>> id(a)
45789792
>>> id([1])
4469824
答案 1 :(得分:2)
在Javascript中,==
运算符会在比较相等性时执行隐式类型转换,因此,[] == ""
将返回true
。 ===
运算符用于在没有类型转换的情况下检查相等性([] === ""
返回false。)
在Python中,is
关键字检查引用相等性。因此,如果x is y
和x
都指向内存中的同一对象,y
将仅返回true。例如:
x = [1, 2, 3]
y = [1, 2, 3]
z = x
x is y # False
x is z # True
可能由此引起的一些问题是建议检查null x is None
。 None
始终指向内存中的相同空间,因此如果x is None
具有无值(True
,则可以放心,x
将始终返回False
否则)。
您可能还会遇到一些怪癖,如下所示:
x = 1
y = 1
x is y # True
以上是CPython(您可能正在使用的Python解释器)中的非标准行为的结果,其中小程序在程序启动时全部分配给特定对象。您可以检查这不适用于较大的数字:
x = 1000
y = 1000
x is y # False
除非您正在检查None
,或者您是否特别想确保两个变量指向内存中的相同位置,否则您应使用==
代替is
。< / p>
答案 2 :(得分:1)
没有。在JS中,is
似乎比===
更加更严格。
在JS中:
对于值类型(数字):如果a和b具有,则
a === b
返回true 相同的值,属于同一类型对于引用类型:如果a和b引用,则
a === b
返回true 完全相同的对象对于字符串:如果a和b都是字符串,则
a === b
返回true 包含完全相同的字符
在Python中:
没有矛盾,除id(obj1)
与id(obj2)
相同外,两个对象都不相同,obj1 is obj2
将评估为False
。