相同内容 Python 字符串什么时候在内存中是同一个对象?

查看原文

CPython 中字符串是不可变对象,解释器有可能会将一些字符串指向相同的对象以节省内存。这里有一些 intern 的规则:

  • 长度为 0 或 1 的字符串是 interned 的。
  • literal 的字符串是 interned 的,动态拼接的不是,例如 "WTF" 是,"".join(["W", "T", "F"]) 不是。
  • 对于第二条规则,加一个特例,字符串中只能出现字母数字和下划线,否则就不是,例如 "WTF~" 就不是。
  • 对于第三条规则,再加一个特例,在交互模式中,如果出现了 a,b="a!","a!", 这个字符串又是 interned,原因是解释器优化。

另外,文章提及了几个边界 case:

  • r"\ some string \" 是不合法的。
  • "a""", 'a''' 是合法的;"""a" , '''a' 是不合法的。前者是implicit string concatenation 的语法,后者违反了三引号的语法(一般用作 docstring)
  • s1 += s2 + s3 快于 s1 = s1 + s2 + s3,原因是前者 s1 对象没有被销毁。
  • 'a'[0][0][0][0][0] 还是合法的哟~