Python中is运算符对字符串与列表表现不同的原因是什么?
关于Python中
is运算符对空列表和空字符串的不同结果解释 问题背景
根据查阅的文档:
is运算符用于检查两个值是否位于内存的同一位置
因此比较两个空列表,得到了预期的False结果:
print([] is []) # False
但对空字符串的比较结果却不同:
print('' is '') # True
原因解释
这是Python的**字符串驻留(string interning)**机制,结合可变/不可变对象的内存管理差异导致的:
- 列表是可变对象:每次创建
[]时,Python都会在内存中生成一个全新的列表实例。哪怕两个列表内容完全相同,它们的内存地址也是独立的,所以[] is []返回False。 - 字符串是不可变对象:Python会对部分字符串做驻留优化——把内容相同的字符串复用同一个内存地址,避免重复创建对象浪费内存。空字符串
''属于会被自动驻留的字面量,所以两次写''指向的是内存中的同一个对象,'' is ''自然返回True。
补充说明:字符串驻留不是所有场景都生效,比如动态拼接生成的字符串(如''.join([]))可能不会被驻留,但像字面量形式的短字符串、空字符串这类简单情况,Python都会自动触发驻留优化。而可变对象(比如列表、字典)不会有这类优化,因为可变对象的内容随时可能被修改,共享实例会引发不可预期的副作用。
内容的提问来源于stack exchange,提问作者Maran Sowthri
相关产品推荐
相关产品推荐

