Javascript 是';是';Python中的关键字与JS中的===关键字相同?
我看到这个问题,现在我很好奇。与JS中的===符号相比,Javascript 是';是';Python中的关键字与JS中的===关键字相同?,javascript,python,comparison,Javascript,Python,Comparison,我看到这个问题,现在我很好奇。与JS中的===符号相比,is操作符在python中的行为如何?不,它们不一样is检查两个对象在Python中是否具有相同的id,即它们是相同的,甚至在内存中也是一样的。您可以做以下检查: >>> a='foo' >>> a is 'foo' True >>> id(a) 44434088 >>> id('foo') 44434088 >>> a=[1] >>>
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
在Javascript中,
=
操作符在比较相等性时将执行隐式类型转换,因此,例如,[]==“
将返回true
。==
运算符用于在不进行类型转换的情况下检查相等性([]==”
返回false。)
在Python中,is
关键字检查引用相等性。因此,只有当x
和y
都指向内存中的同一对象时,x是y
才会返回true。例如:
x=[1,2,3]
y=[1,2,3]
z=x
x是y#假
x是z#真的
可能由此产生的一些问题是建议检查null,x为None
None
始终指向内存中的相同空间,因此可以确保x为None
如果x
具有None值(否则为False
),则始终返回True
你也可能会遇到一些怪癖,比如:
x = 1
y = 1
x is y # True
以上是CPython(您可能正在使用的Python解释器)中一种非标准行为的结果,当程序启动时,小整数都被分配给特定对象。您可以检查这是否适用于较大的数字:
x = 1000
y = 1000
x is y # False
除非您正在检查
None
,或者如果您特别想确保两个变量指向内存中的同一位置,您应该使用=
而不是is
否。Python中的is
似乎比JS中的=
严格得多
在JS中:
对于值类型(数字):a===b
如果a和b具有
相同的值和类型相同
对于引用类型:a===b
如果a和b引用
完全相同的对象
对于字符串:a===b
如果a和b都是字符串和
包含完全相同的字符
在Python中:
毫无矛盾,除了
id(obj1)
与id(obj2)
相同外,这两个对象并不相同,obj1是obj2
将计算为False
FWIW,我认为id(a)
和id('foo'))
当人们试图理解python中的身份时,保持一致常常会让他们感到困惑。解释器实习了'foo'
,这一事实并不是一个真正的入门级python主题:-),那么,它像是对象的散列吗?id
值是如何分配的?is
中的@Ares只有在比较内存中完全相同的对象时才会返回true。是的,但是'foo'
和a
显然不是同一个对象,那么为什么它们的比较返回true呢?@Ares--no,对于返回的两个等价字符串,没有很好的方法来判断是什么
。话虽如此,这是一个相当利基的用例。通常,是
不会对字符串(或小整数)进行比较,而小整数是其他常见的对象,可能会表现出这种奇怪的行为。一般来说,平等就足够了。如果您确实需要进行引用检查,那么在命名的sentinel对象(FOO=object()
而不是FOO='FOO'
)上进行引用检查更为常见。这是怎么回事?它在任何地方都没有提到JS,虽然我知道与==”之间的区别,但我想知道它与==
的关系。