Python中x = 'y' 'z'的底层机制是什么?

37 投票
2 回答
1893 浏览
提问于 2025-04-28 04:47

如果你在Python中运行 x = 'y' 'z',那么 x 的值会变成 'yz'。这意味着,当Python看到多个字符串挨在一起的时候,它会自动把它们连接起来。

那么,这种连接到底是什么呢? 它是实际上在执行 'y' + 'z' 这个操作,还是在执行 ''.join('y','z'),或者是其他什么操作呢?

暂无标签

2 个回答

8

这些字符串在执行之前,已经被Python解析器连接在一起了。所以这并不完全像 'y' + 'z'''.join('y','z'),不过效果是一样的。

58

Python的解析器会把多个相邻的字符串当作一个字符串来处理。这一点在词法分析文档中有详细说明:

字符串字面量连接

多个相邻的字符串字面量(用空格分隔),即使使用不同的引号方式,也是被允许的,它们的意思就等同于把它们连接在一起。因此,"hello" 'world'就等于"helloworld"

编译后的Python代码只看到一个字符串对象;你可以通过让Python生成这样的字符串的抽象语法树(AST)来验证这一点:

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

实际上,构建AST的过程会触发字符串的连接,因为在遍历解析树时会发生这种情况,具体可以查看parsestrplus()函数在AST的C源代码中的实现。

这个特性主要是为了减少使用反斜杠的需要;你可以在仍然处于逻辑的情况下,把一个字符串分成多个物理行:

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

多个物理行可以通过使用圆括号、方括号或花括号隐式连接成一行。

这个字符串连接特性是从C语言中借鉴过来的,但Guido van Rossum曾表示后悔把它加入Python。这篇帖子引发了一场长时间且非常有趣的讨论,很多人支持完全去掉这个特性。

撰写回答