Python中的'is'关键字和JS中的'==='关键字是一样的吗?

3

我看到了这个问题(链接在此),现在我很好奇。在Python中,is运算符与JS中的===标记相比有何不同?


1
这两个问题有什么相同之处呢?它没有提到JS,虽然我知道is==的区别,但我想知道它与===有什么关系。 - Athena
3个回答

7
不,它们不是一样的。在Python中,is检查两个对象是否具有相同的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

3
就我所知,当人们试图理解Python中的标识时,经常会困惑id(a)id('foo')相同的情况。实际上,解释器对'foo'进行了内部化处理并不是一个针对初学者的Python主题。 - mgilson
那么,它是对象的哈希值吗?id 值是如何分配的? - Athena
@Ares 就像 is 只有在比较内存中完全相同的对象时才会返回 true。 - Spencer Wieczorek
@Ares,看一下关于字符串字面值的讨论吧:https://dev59.com/cmAf5IYBdhLWcg3w0VYf - Brian
1
@Ares -- 没有好的方法可以确定两个等效字符串上的 is 返回值。尽管如此,这是一个相当小众的用例。通常不会在字符串(或小整数,这是另一种可能表现出这种奇怪行为的常见对象)上进行 is 比较。相等性通常已经足够了。如果您真的需要进行引用检查,则更常见的做法是在命名的哨兵对象上进行检查(例如 FOO = object() 而不是 FOO = 'foo')。 - mgilson
显示剩余10条评论

2
在Javascript中,== 操作符在比较相等性时会进行隐式类型转换,因此例如 [] == "" 将返回 true。而===操作符用于不进行类型转换的相等性检查([] === "" 返回false)。
在Python中,is关键字检查引用相等性。因此,只有当xy都指向内存中的同一对象时,x is y才会返回true。例如:
x = [1, 2, 3]
y = [1, 2, 3]
z = x
x is y # False
x is z # True

在进行相关it技术的翻译时,有一些需要注意的点。比如建议检查是否为空值,使用语句x is None。由于None总是指向内存中相同的空间,因此可以确保如果x具有空值,则x is None将始终返回True(否则返回False)。

此外,您可能会遇到一些奇怪的现象,例如:

x = 1
y = 1
x is y # True

上述结果是由CPython(您可能正在使用的Python解释器)中的非标准行为导致的,即当程序启动时,小整数都被分配给特定对象。您可以检查这对较大的数字不起作用:
x = 1000
y = 1000
x is y # False

除非你在检查None或者你想确保两个变量指向内存中的同一位置,否则你应该使用==代替is


1

在 Python 中,is 看起来比 JS 中的 === 更加严格。

在 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接