You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:15:08