我刚开始学习Python,所以我的问题可能很显然。但根据W3Schools的说法,只有在“is”运算符下,两个变量引用同一个对象时才相等。那么我的问题是,为什么下面的代码会返回True?我原本认为Python会为它们创建两个不同的内存位置。
a = 500
b = 500
print(a == b) # True
print(a is b) # True, why is this true?
我刚开始学习Python,所以我的问题可能很显然。但根据W3Schools的说法,只有在“is”运算符下,两个变量引用同一个对象时才相等。那么我的问题是,为什么下面的代码会返回True?我原本认为Python会为它们创建两个不同的内存位置。
a = 500
b = 500
print(a == b) # True
print(a is b) # True, why is this true?
你确定这对于值500有效吗?
Python 3.8.10 (default, Jun 2 2021, 10:49:15)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 500
>>> b = 500
>>> a is b
False
>>> b = 100
>>> a = 100
>>> a is b
True
>>>
Python中的预分配
在Python启动时,Python3会保留一个整数对象数组,范围从-5到256。例如,对于int对象,使用了名为NSMALLPOSINTS和NSMALLNEGINTS的宏:
#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS 257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS 5
#endif
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
/* References to small integers are saved in this array so that they
can be shared.
The integers that are saved are those in the range
-NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
*/
static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
#endif
#ifdef COUNT_ALLOCS
Py_ssize_t quick_int_allocs;
Py_ssize_t quick_neg_int_allocs;
#endif
True
。 - user2357112a = 100; b = 100; a is b
打印出 True
。然后,是的,a = 500
会将其分裂,但是 a = 500; a = 100; a is b
再次打印出 True
,分裂和未分裂。@Mandraenke 的答案是正确的。 - joanisPython中“==”和“is”运算符之间的区别 等号(==)比较两个操作数的值并检查值相等性。而“is”运算符检查两个操作数是否引用同一个对象(存在于同一内存位置)
is
测试将返回false。 - Abhijit Sarkarx = 255; x is 255
,则会返回True
,但如果您执行x = 1000; x is 1000
,则会返回False
.很可能在同一表达式中,CPython正在为相同的字面量重复使用整数。这种实现的怪异性是为什么警告您对某些不可变文字使用==
而不是is
。不可变对象的有效标识是它们的值,因此请使用==
。 - BatWannaBe