如果在Python中运行x = 'y' 'z'
,则会将x
设置为'yz'
,这意味着当Python看到彼此相邻的多个字符串时会发生某种字符串连接。 / p>
但这是什么样的连接?
它实际上是在运行'y' + 'z'
还是正在运行''.join('y','z')
或其他什么?
答案 0 :(得分:58)
Python 解析器将其解释为一个字符串。这在Lexical Analysis documentation:
中有详细记载字符串文字串联
允许使用多个相邻的字符串文字(由空格分隔),可能使用不同的引用约定,并且它们的含义与它们的连接相同。因此,
"hello" 'world'
相当于"helloworld"
。
编译后的Python代码只看到一个字符串对象;你可以通过让Python生成这样的字符串的AST来看到这个:
>>> import ast
>>> ast.dump(ast.parse("'hello' 'world'", mode='eval').body)
"Str(s='helloworld')"
实际上,构建AST的行为是触发连接,因为遍历了解析树,请参阅AST C源中的parsestrplus()
function。
该功能专门用于减少对反斜杠的需求;当它仍然在logical line内时,用它来分隔物理线上的字符串:
print('Hello world!', 'This string is spans just one '
'logical line but is broken across multiple physical '
'source lines.')
使用括号,方括号或大括号,可以将多条物理线implicitly be joined放入一条物理线。
此string concatenation feature是从C复制的,但是Guido van Rossum is on record regretting adding it to Python。该帖子引发了一个漫长且非常有趣的帖子,并且完全支持删除该功能。
答案 1 :(得分:8)
在执行任何操作之前,字符串由python解析器连接,所以它不像'y' + 'z'
或''.join('y','z')
,除了它具有相同的效果。