from __future__ import print_function
from dis import dis
def f1(s):
a = "help"
print('f1', id(s), id(a))
return s > a
def f2(s):
a = "help"
print('f2', id(s), id(a))
return s > a
a = "help"
print(id(a))
print(f1("he" + "lp"))
b = "h"
print(f2(b + "elp"))
print("\nf1")
dis(f1)
与所有Python常量一样,字符串文本是在编译时创建的,此时源代码被转换为字节码。而且由于所有Python字符串都是不可变的,如果解释器在多个位置遇到相同的字符串文本,那么解释器可以重用相同的字符串对象。如果文本字符串是通过文本的串联创建的,那么它甚至可以做到这一点,但是如果字符串是通过将字符串文本串联到现有的字符串对象来构建的,则不能做到这一点。你知道吗
下面是一个简短的演示,它在函数内外创建了几个相同的字符串。它还转储其中一个函数的反汇编字节码。你知道吗
运行Python 2.6.6的32位机器上的典型输出
请注意,除了用
b + "elp"
构造的字符串外,所有"help"
字符串的id
都是相同的。(顺便说一句,Python将连接相邻的字符串文字,因此我可以编写
"he" "lp"
,甚至"he""lp"
,而不是编写"he" + "lp"
)。你知道吗字符串文本本身在进程结束时清理自身之前不会被释放,但是像
b
这样的字符串如果超出范围,则会被GC'ed。你知道吗注意,在CPython(标准Python)中,当对象被GC'ed时,它们的内存被返回Python的分配系统进行回收,而不是返回OS。Python确实将不需要的内存返回给操作系统,但仅在特殊情况下。见Releasing memory in Python和Why doesn't memory get released to system after large queries (or series of queries) in django?
另一个讨论这个话题的问题:Why strings object are cached in python
相关问题 更多 >
编程相关推荐