Подтвердить что ты не робот

Что находится под капотом x = 'y' 'z' в Python?

Если вы запустите x = 'y' 'z' в Python, вы получите x значение 'yz', что означает, что происходит какое-то конкатенация строк, когда Python видит несколько строк рядом друг с другом.

Но что это за конкатенация? Действительно ли он работает 'y' + 'z' или работает ''.join('y','z') или что-то еще?

4b9b3361

Ответ 1

Парсер Python интерпретирует это как одну строку. Это хорошо описано в документации Lexical Analysis:

Строковое литеральное конкатенация

Разрешены несколько соседних строковых литералов (ограниченных пробелами), возможно, с использованием разных соглашений о цитировании, и их значение совпадает с их конкатенацией. Таким образом, "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. Этот пост пинает длинную и очень интересную нить с большой поддержкой для полного удаления этой функции.

Ответ 2

Строки конкатенируются парсером python до того, как что-либо выполняется, поэтому его не очень нравится 'y' + 'z' или ''.join('y','z'), за исключением того, что он имеет тот же эффект.