为什么Python中两种去反引号的字符串用is和原串比较返回False
Python字符串is比较返回False的核心原因
首先明确Python两类比较运算符的本质差异:
is用于判断两个变量是否指向内存中的同一个对象,对比的是对象的内存地址==用于判断两个变量指向的对象内容值是否相等,也是字符串值对比场景应该使用的运算符
你遇到的现象本质是Python字符串驻留(interning)机制的触发限制导致的:
字符串驻留的适用场景
Python为了节省内存,会对部分字符串做驻留优化:内容相同的字符串仅在内存中存储一份,多个变量可以复用同一个对象,这类场景下is对比会返回True。但驻留仅在特定场景自动触发:
- 编译期直接定义的、仅由字母、数字、下划线组成的短字符串会自动驻留,你定义的
str0 = "trade"就属于这类驻留字符串 - 运行时通过动态方法生成的字符串默认不会自动驻留,会分配独立的内存空间,成为全新的对象
两种操作返回False的具体原因
你用到的两种处理方式都属于运行时动态生成字符串的场景:
str1.replace("", "")是调用字符串方法在运行时生成的新字符串,虽然内容和str0完全一致,但会占用独立内存,和str0`不是同一个对象"".join(list(str1)[1:])是通过列表切割、join方法动态拼接生成的新字符串,同样不会复用已经驻留的str0的内存地址
你可以通过以下代码验证该逻辑:
str0 = "trade" str1 = "`trade" # 验证replace生成的对象 new_str1 = str1.replace("`", "") print(id(str0)) # 输出str0的内存地址 print(id(new_str1)) # 输出的地址和str0完全不同 print(new_str1 == str0) # 内容对比返回True # 验证join生成的对象 new_str2 = "".join(list(str1)[1:]) print(id(new_str2)) # 地址和str0、new_str1都不同 print(new_str2 == str0) # 内容对比返回True
内容的提问来源于stack exchange,提问作者H T
相关产品推荐
相关产品推荐

