Python中哪些变量类型取值相同时会指向同一内存地址
Python相同取值变量的内存地址分配情况
这个问题的本质和CPython的对象驻留机制、对象是否可修改的属性直接相关,不同类型的表现差异很大,我们可以基于你给出的测试代码逐一说明:
首先是你提供的测试代码:
a1, b1 = 1, 1 #int a2, b2 = 1.1, 1.1 #float a3, b3 = 1j, 1j #complex a4, b4 = [1, 2], [1, 2] #list a5, b5 = (1, 2), (1, 2) #tuple a6, b6 = range(10), range(10) #range a7, b7 = {"a": 1, "b": 2}, {"a": 1, "b": 2} #dict a8, b8 = {1, 2}, {1, 2} #set a9, b9 = frozenset({1, 2}), frozenset({1, 2}) #frozenset a10, b10 = True, True #bool a11, b11 = b"aa", b"aa" #bytes a12, b12 = bytearray((1, 2)), bytearray((1, 2)) #bytearray
不同类型的测试结果
相同取值一定会共享内存的类型
- int:小整数池(默认范围-5~256)内的整数是全局驻留的单例,相同取值永远共享内存,代码中
a1 is b1返回True。注意超过小整数池范围的大整数不会默认全局驻留,仅同一句代码内的赋值可能共享内存。 - bool:只有True、False两个全局单例对象,相同取值永远共享内存,
a10 is b10返回True。 - bytes:符合标识符命名规则的短bytes会被驻留,代码中的
b"aa"符合规则,a11 is b11返回True。 - 你未列的字符串类型:规则和bytes一致,符合标识符的短字符串会全局驻留,相同取值共享内存。
不可变但相同取值也不会默认共享内存的类型
这类类型本身不允许修改,但没有全局驻留机制,就算取值一致,每次创建字面量都会生成新对象:
- float:
a2 is b2返回False - complex:
a3 is b3返回False - 非空tuple:
a5 is b5返回False,仅空元组有全局驻留 - range:
a6 is b6返回False,相同参数的range对象默认不会共享内存 - frozenset:
a9 is b9返回False
所有可变类型,相同取值绝对不会共享内存
可变类型允许修改内容,为了避免修改一个变量影响到其他变量,只要你写出新的字面量,就会创建独立的新对象:
- list:
a4 is b4返回False - dict:
a7 is b7返回False - set:
a8 is b8返回False - bytearray:
a12 is b12返回False
以上结论基于CPython默认实现,其他Python解释器(如PyPy)的驻留策略可能存在差异,实际结果以运行环境为准。
内容的提问来源于stack exchange,提问作者chakmeshma
相关产品推荐
相关产品推荐

