5 ответов:
в основном, потому что python немного мягок в обработке обратной косой черты. Цитата из https://docs.python.org/2.0/ref/strings.html :
В отличие от стандартного C, все нераспознанные escape-последовательности остаются в строке без изменений, т. е. обратная косая черта слева в строке.
(выделено в оригинале)
поэтому, в python, это не то, что три обратные косые черты равны четырем, это то, что когда вы следуйте обратную косую черту с символом, как
?, вдвоем, как два символа, потому что\?не является распознанной escape-последовательностью.
это потому, что обратная косая черта действует как escape-символ для символа(ов) сразу после него, если комбинация представляет допустимую escape-последовательность. Дюжина или около того escape-последовательностей перечисленные здесь. Они включают в себя очевидные, такие как newline
\nгоризонтальные вкладки\t, возврат каретки\rи более неясные, такие как именованные символы юникода с помощью\N{...}, например,\N{WAVY DASH}который представляет собой символ Юникода\u3030. Однако ключевым моментом является что если escape-последовательность не известна, последовательность символов остается в строке как есть.часть проблемы может также заключаться в том, что вывод интерпретатора Python вводит вас в заблуждение. Это связано с тем, что обратные косые черты экранируются при отображении. Однако, если вы print эти строки, вы увидите, что дополнительные обратные косые черты исчезают.
>>> '?\\?' '?\\?' >>> print('?\\?') ?\? >>> '?\\?' == '?\?' # I don't know why you think this is True??? False >>> '?\\?' == r'?\?' # but if you use a raw string for '?\?' True >>> '?\\?' == '?\\?' # this is the same string... see below Trueдля ваших конкретных примеров, в первом случае
'?\\?', первый\избегает второй обратной косой черты оставляя одну обратную косую черту, но третья обратная косая черта остается обратной косой чертой, потому что\?не является допустимым escape-последовательность. Следовательно, результирующая строка?\?.для второго случая
'?\\?', первая обратная косая черта ускользает от второй, а третья обратная косая черта ускользает от четвертой, что приводит к строке?\?.так вот почему три обратные косые черты-это то же самое, что четыре:
>>> '?\\?' == '?\\?' Trueесли вы хотите создать строку с 3 обратными косыми чертами, вы можете побег каждый обратный Слэш:
>>> '?\\\?' '?\\\?' >>> print('?\\\?') ?\\?или вы можете найти "сырые" строки более понятными:
>>> r'?\\?' '?\\\?' >>> print(r'?\\?') ?\\?это повороты обработки escape-последовательности для строкового литерала. Смотрите Строковые Литералы для более подробной информации.
, потому что
\xв символьной строке, когдаxне является одним из специальных символов обратной косой черты, таких какn,r,t,0, etc, вычисляет строку с обратной косой чертой, а затемx.>>> '\?' '\?'
со страницы лексического анализа python в разделе строковые литералы по адресу: https://docs.python.org/2/reference/lexical_analysis.html
существует таблица, в которой перечислены все распознанные escape-последовательности.
\\ является escape-последовательностью, которая===\
\? не является escape-последовательностью и===\?
Итак, '\ \ \ \ '- это'\\', за которым следует'\\', который является ' \ \ '(два экранированных \)
и '\ \ \ '- это'\\', за которым следует'\', который также является'\\' (один сбежал \ и один сырой \)
кроме того, следует отметить, что python не различает одинарные и двойные кавычки, окружающие строковый литерал, в отличие от некоторых других языков.
таким образом, "строка" и "строка" - это одно и то же в python, они не влияют на интерпретацию escape-последовательностей.
ответ mhawke в значительной степени охватывает его, я просто хочу изложить его в более сжатой форме и с минимальными примерами, которые иллюстрируют это поведение.
Я думаю, что одна вещь, чтобы добавить, что escape-обработка перемещается слева направо, так что
\nсначала находит обратную косую черту, а затем ищет символ для побега, а затем находитnи убегает от него;\nнаходит первую обратную косую черту, находит вторую и избегает ее, а затем находитnи видит его как литерал Н;\?находит обратная косая черта и ищет символ, чтобы убежать, находит?которого нельзя избежать, и так лечит\как буквальная обратная косая черта.как отметил mhawke, ключ здесь заключается в том, что интерактивный интерпретатор избегает обратной косой черты при отображении строки. Я предполагаю, что причина этого заключается в том, чтобы убедиться, что текстовые строки, скопированные из интерпретатора в редактор кода, являются допустимыми строками python. Однако в данном случае это пособие для удобства вызывает путаницу.
>>> print('\?') # \? is not a valid escape code so backslash is left as-is \? >>> print('\?') # \ is a valid escape code, resulting in a single backslash '\?' >>> '\?' # same as first example except that interactive interpreter escapes the backslash \? >>> '\?' # same as second example, backslash is again escaped \?
Comments