Почему 3 обратные косые черты равны 4 в строке Python?



не могли бы вы сказать мне, почему '?\?'=='?\?' дает True? Что сводит меня с ума и я не могу найти разумного ответа...



>>> list('?\?')
['?', '', '', '?']
>>> list('?\?')
['?', '', '', '?']
532   5  

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

    Ничего не найдено.