相同内容 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]
还是合法的哟~