在网上有一个很有名的例子(以下例子的环境为Windows 10, Python 3.9.1):
1 2 3 4 5 6 7 8 9 10 11 | >>> a = 256 >>> b = 256 >>> a is b True >>> a = 257 >>> b = 257 >>> a is b False >>> a, b = 257 , 257 >>> a is b True |
整数被频繁的申请和销毁。那为什么a和b两个变量都是257的时候,判断a is b 为什么会出现两种不同的结果呢?
实际上当多个变量处于同一行的,并且初始化值相同的时候,Python解释器会将这些变量,指向同一个对象(前提条件是对象为不可变类型)。如图:
上述内容都是交互式环境得到的结果,如果将以下代码写入到py文件中,得到的结果又不太一样。如下代码:
a = 123456789
d = 257
b = 123456789
c = 123456789
print(id(a))
print(id(b))
print(id(c))
print(id(d))
print(a is b)
print(a is c)
print(b is c)
结果如下:
1936955721200
1936955721200
1936955721200
1936955721232
True
True
True
结论(前提条件是,对象是不可变类型):
- 第一个例子处于交互式环境下,当变量处于不同行的时候,即便是初始值相同,Python解释器也不知道我们已经创建了一个int对象257,所以解释器又在内存中创建了一个新的int对象。
- 第二个例子是写在py文件中的,Python解释器能清楚的知道,第一行已经创建了int对象123456789,如果后面还有变量的值也等于123456789,会将该变量也指向已经存在的int对象,哪怕中间隔了一行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构