Skip to main content
 首页 » 编程设计

Python 解析器/编译器与解释器,以及字符串连接编译时与运行时

2025年05月04日15lori

在 this spot in this articl e 由一位主要的 Python 人员编写,作者指出自动字符串连接是解析器/编译器的一项功能,而不是解释器,这就是为什么必须在运行时使用 + 连接字符串的原因。

我对此一无所知。我知道你可以用 + 连接,我知道并排的两个字符串文字是自动连接的,我知道你当然不能用包含字符串的变量来做,但我不知道有什么区别介于解析器/编译器和解释器(对于 python 或一般而言)之间,我不知道它如何与整个字符串连接相关联。

解释???

请您参考如下方法:

Python 是一种解释型语言(与 C++ 等在执行前编译为机器代码的语言相反)。

现在有一个中间步骤:源(文本)文件被编译为字节码,然后该字节码由 Python 解释器运行。

字节码编译器已经完成逐字字符串连接(如 "a""b" 变成 "ab")。 "a"+ "b" 也是如此,因为编译器已经可以计算出文字值:

>>> import dis 
>>> def s(): print "a" "b" 
... 
>>> dis.dis(s) 
  1           0 LOAD_CONST               1 ('ab') 
              3 PRINT_ITEM 
              4 PRINT_NEWLINE 
              5 LOAD_CONST               0 (None) 
              8 RETURN_VALUE 
>>> def s(): print "ab" 
... 
>>> dis.dis(s) 
  1           0 LOAD_CONST               1 ('ab') 
              3 PRINT_ITEM 
              4 PRINT_NEWLINE 
              5 LOAD_CONST               0 (None) 
              8 RETURN_VALUE 
>>> def s(): print "a"+"b" 
... 
>>> dis.dis(s) 
  1           0 LOAD_CONST               3 ('ab') 
              3 PRINT_ITEM 
              4 PRINT_NEWLINE 
              5 LOAD_CONST               0 (None) 
              8 RETURN_VALUE 

但是对于不能在编译时简单推断的值,解释器的工作就是进行连接:

>>> def s(): print "a" + chr(98) 
... 
>>> dis.dis(s) 
  1           0 LOAD_CONST               1 ('a') 
              3 LOAD_GLOBAL              0 (chr) 
              6 LOAD_CONST               2 (98) 
              9 CALL_FUNCTION            1 
             12 BINARY_ADD 
             13 PRINT_ITEM 
             14 PRINT_NEWLINE 
             15 LOAD_CONST               0 (None) 
             18 RETURN_VALUE 
>>> s() 
ab