2015-06-14 2 views
2

В Python 3.x:Котировки в кавычках

print(""s"")  # SyntaxError 
    print("""s""")  # prints s 
    print(""""s"""") # SyntaxError 
    print("""""s""""") # prints ""s 

Какова причина этого различного поведения, когда существует разное количество двойных кавычек в строке?

ответ

6

В Python вы можете создавать многострочные строки с """...""". Цитирование documentation for strings,

Строковые литералы могут охватывать несколько линий. Один из способов - использование тройных котировок: """...""" или '''...'''.

В вашем первом случае, ""s"" анализируется как этот

"" (empty string literal) s "" (empty string literal) 

Теперь, Python не знает, что делать с s. Вот почему он не работает с SyntaxError.

В вашем третьем случае строка не анализируется, как этот

""" "s """ (End of multiline string) `"` 

Теперь последний " уже нет совпадений ". Вот почему он терпит неудачу.

В последнем случае, """""s""""" анализируется как этот

""" ""s """ "" 

Итак, многострочный строка разобранного успешно, а затем у вас есть пустая строка буквального рядом с ним. В Python, вы можете объединить два строковых литералов, записывая их рядом друг с другом, как этот

print ("a" "b") 
# ab 

Так, последняя пустая строка литерал сцепленного с ""s.

1

Ответственные за это строковые правила конкатенации строк, унаследованные от C. Рассмотрим это:

x = "a" "b" 

Две строки объединены в одну, в соответствии с синтаксисом Python.

Другим аспектом этого является то, что также существуют тройные кавычки (предназначенные для многострочных строк, таких как строки документа), что еще больше усложняет проблему. Там начальная тройная кавычка соответствует следующей тройной кавычки.

Теперь рассмотрите ваши случаи, что свет и группируйте каждую двойную кавычку или тройные кавычки. Вы обнаружите, что в одном случае у вас есть один токен s посередине, иногда s является частью строки, иногда в конце есть остаточные цитаты и т. Д.

3

Есть две вещи, которые нужно знать, чтобы понять это:

  1. Как и обычные строки "foo" Python имеет многострочные строки, которые открываются и закрываются с три кавычки """foo""" (см String Literals); и
  2. Последовательные строковые литералы объединены "foo" "bar" == "foobar" (см. String Literal Concatenation).

Как для четырех примеров:

""s"" 

закрывает единственную цитату до появления s, так что эквивалентно:

x = "" 
x s x 

, который, очевидно, не имеет никакого смысла.

"""s""" 

многострочный строка с одного символа в.

""""s"""" 

многострочный строка, содержащая два символа ("s) следуют одной непревзойденной цитаты.

"""""s""""" 

многострочная строка, содержащая три символа (""s) сцеплен с пустой строкой буквальной.

Смежные вопросы