python是否为相等比较中的字符串常量创建对象?

2024-04-23 17:12:53 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,对于这样的比较,python是否为字符串常量“help”创建一个临时对象,然后继续进行相等比较?物体在某个点之后会被GCed。你知道吗

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

Tags: 对象字符串ifhelp物体blah常量s1
1条回答
网友
1楼 · 发布于 2024-04-23 17:12:53

与所有Python常量一样,字符串文本是在编译时创建的,此时源代码被转换为字节码。而且由于所有Python字符串都是不可变的,如果解释器在多个位置遇到相同的字符串文本,那么解释器可以重用相同的字符串对象。如果文本字符串是通过文本的串联创建的,那么它甚至可以做到这一点,但是如果字符串是通过将字符串文本串联到现有的字符串对象来构建的,则不能做到这一点。你知道吗

下面是一个简短的演示,它在函数内外创建了几个相同的字符串。它还转储其中一个函数的反汇编字节码。你知道吗

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 2.6.6的32位机器上的典型输出

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        

请注意,除了用b + "elp"构造的字符串外,所有"help"字符串的id都是相同的。
(顺便说一句,Python将连接相邻的字符串文字,因此我可以编写"he" "lp",甚至"he""lp",而不是编写"he" + "lp")。你知道吗

字符串文本本身在进程结束时清理自身之前不会被释放,但是像b这样的字符串如果超出范围,则会被GC'ed。你知道吗

注意,在CPython(标准Python)中,当对象被GC'ed时,它们的内存被返回Python的分配系统进行回收,而不是返回OS。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

相关问题 更多 >