下面是Python字符串的一些微妙的特性,绝对会让你大吃一惊。
案例一:
案例二:
案例三:
很好理解, 对吧?
💡 说明:
- 这些行为是由于 Cpython 在编译优化时, 某些情况下会尝试使用已经存在的不可变对象而不是每次都创建一个新对象. (这种行为被称作字符串的驻留[string interning])
- 发生驻留之后, 许多变量可能指向内存中的相同字符串对象. (从而节省内存)
- 在上面的代码中, 字符串是隐式驻留的. 何时发生隐式驻留则取决于具体的实现. 这里有一些方法可以用来猜测字符串是否会被驻留:
- 所有长度为 0 和长度为 1 的字符串都被驻留.
- 字符串在编译时被实现 (‘wtf’ 将被驻留, 但是 ‘’.join([‘w’, ‘t’, ‘f’]) 将不会被驻留)
- 字符串中只包含字母,数字或下划线时将会驻留. 所以 ‘wtf!’ 由于包含 ! 而未被驻留. 可以在【地址1】找到 CPython 对此规则的实现.最后