python是否在相等比较中为字符串常量创建了一个对象?

时间:2016-02-15 05:51:30

标签: python

在python这样的比较中,python是否为字符串常量创建了一个临时对象" help"然后继续平等比较?在某些方面之后,该对象将被GC。

s1 = "nohelp"
if s1 == "help":
   # Blah Blah

1 个答案:

答案 0 :(得分:4)

与所有Python常量一样,字符串文字是在编译时创建的,当源代码转换为字节代码时。并且因为所有Python字符串都是不可变的,所以如果解释器在多个位置遇到相同的字符串文字,则它可以重用相同的字符串对象。如果通过文字的连接创建文字字符串,它甚至可以这样做,但如果通过将字符串文字连接到现有的字符串对象来构建字符串则不行。

这是一个简短的演示,可以在函数内部和外部创建一些相同的字符串。它还会转储其中一个函数的反汇编字节码。

onCreateView
运行Python 2.6.6的32位计算机上的

典型输出

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)    

请注意,所有3073880672 f1 3073880672 3073880672 False f2 3073636576 3073880672 False f1 26 0 LOAD_CONST 1 ('help') 3 STORE_FAST 1 (a) 27 6 LOAD_GLOBAL 0 (print) 9 LOAD_CONST 2 ('f1') 12 LOAD_GLOBAL 1 (id) 15 LOAD_FAST 0 (s) 18 CALL_FUNCTION 1 21 LOAD_GLOBAL 1 (id) 24 LOAD_FAST 1 (a) 27 CALL_FUNCTION 1 30 CALL_FUNCTION 3 33 POP_TOP 28 34 LOAD_FAST 0 (s) 37 LOAD_FAST 1 (a) 40 COMPARE_OP 4 (>) 43 RETURN_VALUE 个字符串的id除了使用"help"构建的字符串外,都是相同的。 (顺便说一句,Python将连接相邻的字符串文字,因此我可以写b + "elp",甚至"he" + "lp",而不是写"he" "lp"

在进程在终止时自行清理时,字符串文字本身不会被释放,但如果超出范围,则"he""lp"之类的字符串将被GC。

请注意,在CPython(标准Python)中,当对象是GC时,他们的内存将返回到Python的分配系统以便回收,到操作系统。 Python 将不需要的内存返回给操作系统,但仅限于特殊情况。请参阅Releasing memory in PythonWhy doesn't memory get released to system after large queries (or series of queries) in django?

讨论此主题的另一个问题:Why strings object are cached in python