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

tem*_*ame 1 python python-3.x

这一点上,由一位主要的Python人员提出,作者指出自动字符串连接是解析器/编译器的一个特性,而不是解释器,这就是为什么必须+在运行时使用连接字符串的原因.

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

说明???

Tim*_*ker 6

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
Run Code Online (Sandbox Code Playgroud)

但是对于在编译时无法简单推断的值,执行连接是解释器的工作:

>>> 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
Run Code Online (Sandbox Code Playgroud)