如果你希望 anda是b相等的(a == b == 32)但不同的对象(a is not b),那么答案可能取决于 Python 的具体实现。
例如,在 CPython 中,小整数被缓存为……也就是说,在 CPython32 is (16*2) is (31+1)中只有一个对象表示一个数字32。32整数在 Python 中是不可变的,所以无论每次返回相同的对象还是不同,算法都不会改变。
请注意,运算符不is应用于比较数字。由于不同的对象可以具有相同的值(相等),例如,1000 == (999+1)但是1000 is not (999+1)(在这种情况下,(999+1)返回一个新对象,不同于为1000常量创建的对象)。is可用于与单例进行比较——一个存在于单个实例中的对象,例如None. Python 不承诺表示数字的对象存在于单个实例中,因此使用==整数进行比较。
a == b == 32 and a is not b将字面问题 ( ) 视为谜语(不用于实际用途)时,有多种解决方案。
要绕过小数字缓存,您可以从中派生一个int类:
>>> a = 32
>>> class Int(int):
... pass
...
>>> b = Int(a)
>>> a == b == 32 and a is not b
True
>>> import ctypes
>>> import sys
>>> a = 32
>>> b = 42
>>> (ctypes.c_ubyte * sys.getsizeof(b)).from_address(id(b))[-4] = a
>>> a == b == 32 and a is not b
True
>>> type(a) == type(b) == int
True
>>> (32 + 10) == 32
True
b = a使b名称引用与名称相同的对象a。该操作检查两个名称是否指向同一个对象,因此在 Python 中
a is b它总是a is b在True后面。a = b如果您希望名称
b引用除 以外的对象a,则只需分配任何其他对象,例如,b = None对于问题中的示例,或者您可以完全删除该名称del b(如果您在此之后尝试使用它,则会出现异常被提高)。如果你希望 and
a是b相等的(a == b == 32)但不同的对象(a is not b),那么答案可能取决于 Python 的具体实现。例如,在 CPython 中,小整数被缓存为……也就是说,在 CPython
32 is (16*2) is (31+1)中只有一个对象表示一个数字32。32整数在 Python 中是不可变的,所以无论每次返回相同的对象还是不同,算法都不会改变。请注意,运算符不
is应用于比较数字。由于不同的对象可以具有相同的值(相等),例如,1000 == (999+1)但是1000 is not (999+1)(在这种情况下,(999+1)返回一个新对象,不同于为1000常量创建的对象)。is可用于与单例进行比较——一个存在于单个实例中的对象,例如None. Python 不承诺表示数字的对象存在于单个实例中,因此使用==整数进行比较。a == b == 32 and a is not b将字面问题 ( ) 视为谜语(不用于实际用途)时,有多种解决方案。要绕过小数字缓存,您可以从中派生一个
int类:或者使用
floator 任何其他可以与整数进行比较的类型:最后,如果你想要
type(a) == type(b) == intwhereint是内置PyLongObject类型,那么可以做坏事并更改已知常量的值42:id(b)42在 CPython中返回表示 , 的内存中对象的地址sys.getsizeof(b)b以字节为单位返回对象的大小(ctypes.c_ubyte * sys.getsizeof(b))指定b对象可以容纳的字节数组类型 (unsigned char[28]).from_address()从内存中创建一个数组,从b对象所在的地址开始arr[-4] = a将末尾的第四个字节分配给32. 更改常量有什么影响42(它与(单个数字/数字更改)在内存中的表示方式有关,特别是它说命令正在使用,这证实了我机器上的字节顺序,这也证实了)。_longobjectpython3PYLONG_BITS_IN_DIGIT == 30sys.int_infosys.byteorder该代码的灵感来自文章:“......如何摆脱使用 Python 编写的同事”。
赋值总是在内存中分配一个新位置,除非它是一个集合。
但在这种情况下,我们谈论的是优化语言的性能,因为这个数字可能不仅仅是你决定使用的:)
这是另一个带有集合的示例:
但是如果你选择一个更大的数字,那么内存中的区域就已经不一样了,因为这个数字显然没有被程序使用:
因此,如果你检查数字,那么你必须使用比较
==。你可以这样尝试: