Python中x ='y''z'的内幕是什么?

mer*_*att 37 python string syntax concatenation python-internals

如果您运行x = 'y' 'z'在Python中,你得到x设置'yz',这意味着当Python看到彼此相邻的多个字符串某种字符串连接的发生.

但这是什么样的串联?它实际上正在运行'y' + 'z'还是正在运行''.join('y','z')或其他什么?

Mar*_*ers 58

Python 解析器将其解释为一个字符串.这在Lexical Analysis文档中有详细记录:

字符串文字串联

允许使用多个相邻的字符串文字(由空格分隔),可能使用不同的引用约定,并且它们的含义与它们的连接相同.因此,"hello" 'world'相当于"helloworld".

编译后的Python代码只看到一个字符串对象; 你可以通过要求Python生成这样的字符串的AST来看到这一点:

>>> import ast
>>> ast.dump(ast.parse("'hello' 'world'", mode='eval').body)
"Str(s='helloworld')"
Run Code Online (Sandbox Code Playgroud)

事实上,在遍历解析树时,正是构建AST的行为触发了连接,请参阅AST C源代码中的parsestrplus()函数.

该功能专门用于减少对反斜杠的需求; 当它仍在逻辑内时,使用它来分隔物理行的字符串:

print('Hello world!', 'This string is spans just one '
      'logical line but is broken across multiple physical '
      'source lines.')
Run Code Online (Sandbox Code Playgroud)

通过使用括号,方括号或花括号可以隐式地将多个物理线连接到一个物理线中.

这个字符串连接功能是从C复制的,但是Guido van Rossum在记录中遗憾地将它添加到Python中.该帖子引发了一个漫长且非常有趣的帖子,并且完全删除了该功能.

  • @heltonbiker:它适用于同一**逻辑**行上的字符串.如果涉及反斜杠,括号或括号,则可以跨越多个物理线. (3认同)
  • 请注意,源中相邻字符串的串联很大程度上是 C 系列的传统。 (2认同)

tde*_*ney 8

在执行任何操作之前,字符串由python解析器连接,所以它不是真的喜欢'y' + 'z'或者''.join('y','z'),除了它具有相同的效果.