Javascript 是';是';Python中的关键字与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] >>>

我看到这个问题,现在我很好奇。与JS中的===符号相比,
is
操作符在python中的行为如何?

不,它们不一样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,虽然我知道
与==”之间的区别,但我想知道它与
==
的关系。