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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:09:04