我看到了这个问题(链接在此),现在我很好奇。在Python中,is
运算符与JS中的===标记相比有何不同?
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
id(a)
和id('foo')
相同的情况。实际上,解释器对'foo'
进行了内部化处理并不是一个针对初学者的Python主题。 - mgilsonid
值是如何分配的? - Athenais
只有在比较内存中完全相同的对象时才会返回 true。 - Spencer Wieczorekis
返回值。尽管如此,这是一个相当小众的用例。通常不会在字符串(或小整数,这是另一种可能表现出这种奇怪行为的常见对象)上进行 is
比较。相等性通常已经足够了。如果您真的需要进行引用检查,则更常见的做法是在命名的哨兵对象上进行检查(例如 FOO = object()
而不是 FOO = 'foo'
)。 - mgilson==
操作符在比较相等性时会进行隐式类型转换,因此例如 [] == ""
将返回 true
。而===
操作符用于不进行类型转换的相等性检查([] === ""
返回false)。is
关键字检查引用相等性。因此,只有当x
和y
都指向内存中的同一对象时,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
x = 1000
y = 1000
x is y # False
除非你在检查None
或者你想确保两个变量指向内存中的同一位置,否则你应该使用==
代替is
。
在 Python 中,is
看起来比 JS 中的 ===
更加严格。
在 JS 中:
对于值类型(数字):如果 a 和 b 具有相同的值并且是相同的类型,则
a === b
返回 true对于引用类型:如果 a 和 b 引用了完全相同的对象,则
a === b
返回 true对于字符串:如果 a 和 b 都是字符串并且包含完全相同的字符,则
a === b
返回 true
id(obj1)
与id(obj2)
相同,否则两个对象都不是相同的,obj1 is obj2
将会评估为False
。
is
和==
的区别,但我想知道它与===
有什么关系。 - Athena