python是否为相等比较中的字符串常量创建对象?
在python中进行类似的比较时,python是否为字符串常量“help”创建一个临时对象,然后继续进行相等比较?该对象将在某个点后进行GCedpython是否为相等比较中的字符串常量创建对象?,python,Python,在python中进行类似的比较时,python是否为字符串常量“help”创建一个临时对象,然后继续进行相等比较?该对象将在某个点后进行GCed s1 = "nohelp" if s1 == "help": # Blah Blah 与所有Python常量一样,字符串文本是在编译时创建的,此时源代码被转换为字节码。而且,由于所有Python字符串都是不可变的,如果解释器在多个位置遇到相同的字符串文本,它可以重用相同的字符串对象。如果文字字符串是通过文字串接创建的,它甚至可以做到这一点,但如
s1 = "nohelp"
if s1 == "help":
# Blah Blah
与所有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”
构造的字符串之外,所有帮助“
字符串的id
s都是相同的
(顺便说一句,Python将连接相邻的字符串文本,因此我可以编写“he”+“lp”
,而不是“he”“lp”
,甚至“he”“lp”
)
在进程结束时清理自身之前,字符串文本本身不会被释放,但是像b
这样的字符串如果超出范围,则会被GC'ed
请注意,在CPython(标准Python)中,当对象被GC’ed时,它们的内存将返回到Python的分配系统进行回收,而不是返回到操作系统。Python确实会将不需要的内存返回到操作系统,但仅在特殊情况下。看到和
讨论此主题的另一个问题是:字符串文本不应该分配任何内存,也不需要gc。我不知道为什么PythonIn-Python会有不同,甚至函数也是对象,@Tim。为什么字符串不是对象?但是“帮助”没有分配给任何对象。我不是说谢谢。这就是我所怀疑的。