Python id函数解析:未赋值给变量的值为何能返回唯一标识符?
为什么直接对未赋值的字面量调用Python的id()也能返回唯一标识符?
先看你给出的两个示例:
第一个示例,赋值变量后调用id和直接用字面量调用id结果一致:
x="ADCAADAFAVVA" print(id(x)) print(id("ADCAADAFAVVA")) # 输出: # 123456789 # 123456789
第二个示例,直接对未赋值的字面量调用id也能得到结果:
print(id("ADadasdaaqdas")) # 输出: # 98231527347
核心原因:Python里一切都是对象
不管是赋值给变量的字符串,还是你直接写在代码里的字面量,本质上都是Python对象。当代码执行到id("ADadasdaaqdas")时,Python解释器会先在内存中创建这个字符串对象,然后把这个对象传给id()函数——id()的作用本来就是返回对象在内存中的唯一标识(也就是内存地址),所以哪怕这个对象没有被任何变量引用,只要它在内存中存在,id()就能返回它的标识。
补充解释第一个示例的现象
第一个示例里两个id相同,是因为Python的**字符串驻留(String Interning)**机制:对于某些符合规则的字符串(比如由字母、数字、下划线组成的字符串,或者较短的字符串),解释器会复用同一个内存对象,避免重复创建。所以变量x指向的对象和你直接写的"ADCAADAFAVVA"字面量是同一个,自然id相同。
关于临时对象的回收
那些没有被变量引用的字面量对象,在id()执行完成后,因为没有任何引用指向它,Python的垃圾回收机制会很快把它从内存中清理掉,但在调用id()的那个瞬间,它确实是存在于内存中的,所以能被id()获取到标识。
内容的提问来源于stack exchange,提问作者AdityaMani
相关产品推荐
相关产品推荐

