>> string'\test\test\x01\x02\x03'>>> string = "5">>> string'5'>>> string = "5\6\7">>> string'5\x06\" />

Почему числа в строке становятся "x0n", когда им предшествует обратный слеш?

python string python-3.x

859 просмотра

2 ответа

422 Репутация автора

Я провел несколько экспериментов с escape-слешами в оболочке Python 3.4 и заметил кое-что довольно странное.

>>> string = "\test\test\1\2\3"
>>> string
'\test\test\x01\x02\x03'
>>> string = "5"
>>> string
'5'
>>> string = "5\6\7"
>>> string
'5\x06\x07'

Как вы можете видеть в приведенном выше коде, я определил переменную строку как "\test\test\1\2\3". Тем не менее, когда я вошел stringв консоль, вместо печати "\test\test\1\2\3", он напечатал "\test\test\x01\x02\x03". Почему это происходит и для чего оно используется?

Автор: Dorian Dore Источник Размещён: 10.05.2015 01:53

Ответы (2)


8 плюса

772441 Репутация автора

Решение

В строковых литералах Python \символ запускает escape-последовательности. \nпереводит в символ новой строки, \tв табуляцию и т. д. \xhhшестнадцатеричные последовательности позволяют вместо этого создавать кодовые точки с шестнадцатеричными значениями, \uhhhhсоздавать кодовые точки с 4-значными шестнадцатеричными значениями и \Uhhhhhhhhсоздавать кодовые точки с 8-значными шестнадцатеричными значениями.

См. Документацию String и Bytes Literals , в которой содержится таблица всех возможных escape-последовательностей.

Когда Python отображает строковый объект в интерпретаторе (или вы используете repr()функцию для строкового объекта), тогда Python создает представление строкового значения. Это представление использует тот же синтаксис строкового литерала Python, чтобы упростить отладку ваших значений, так как вы можете использовать представление для воссоздания одного и того же значения.

Чтобы непечатные символы не вызывали хаос или вообще не отображались, Python использует тот же синтаксис escape-последовательности для представления этих символов. Таким образом, байты, которые не могут быть напечатаны, представлены с использованием подходящих \xhhпоследовательностей или, если возможно, одной из \cоднобуквенных букв (так что переводы строки отображаются как \n)

В вашем примере вы создали непечатаемые байты, используя синтаксис escape-последовательности \ooo восьмеричного значения . Цифры интерпретируются как восьмеричное число для создания соответствующей кодовой точки. Когда вы возвращаете это строковое значение обратно, используется \xhhсинтаксис по умолчанию для представления точно такого же значения в шестнадцатеричном виде:

>>> '\20' # Octal for 16
'\x10'

в то время как ваш \tстал символом табуляции :

>>> print('\test')
    est

Обратите внимание, что там нет буквы t; вместо этого оставшийся estотступ с помощью пробела, горизонтальной табуляции.

Если вам нужно включить буквенные \ символы обратной косой черты, вам нужно удвоить символ:

>>> '\\test\\1\\2\\3'
'\\test\\1\\2\\3'
>>> print('\\test\\1\\2\\3')
\test\1\2\3
>>> len('\\test\\1\\2\\3')
11

Обратите внимание, что в представлении используются двойные обратные слеши ! Если этого не произойдет, вы не сможете скопировать строку и вставить ее обратно в Python, чтобы воссоздать значение. Использование print()для записи значения в терминал в виде фактических символов (а не в виде строкового представления) показывает, что в нем присутствуют одиночные обратные слэши, а если взять длину, то у нас в строке всего 11 символов, а не 15.

Вы также можете использовать необработанный строковый литерал. Это просто другой синтаксис, строковые объекты, созданные из синтаксиса, имеют точно такой же тип, с тем же значением. Это просто другой способ записи строковых значений. В необработанном строковом литерале обратная косая черта - это просто обратная косая черта, если она не является последним символом в строке; большинство escape-последовательностей не работают в необработанном строковом литерале:

>>> r'\test\1\2\3'
'\\test\\1\\2\\3'

И последнее , но не в последнюю очередь, если вы создаете строки, представляющие имена файлов на вашей системе Windows, вы можете также использовать вперед слэш; большинство API в Window не возражают и принимают оба типа слеша в качестве разделителей в имени файла:

>>> 'C:/This/is/a/valid/path'
'C:/This/is/a/valid/path'
Автор: Martijn Pieters Размещён: 10.05.2015 01:59

2 плюса

840 Репутация автора

Когда ты пишешь

string = "\test\test\1\2\3"

Python считает, что вы хотите определить строку символов, которая начинается с символа табуляции ("\ t"), затем символа "e", затем "s" и т. Д. Python также считает, что вы хотите включить некоторые непечатаемые символы, соответствующие литеральным числам 1, 2 и 3, которые обеспечивают сокращения «\ 1», «\ 2» и «\ 3».

Автор: hft Размещён: 10.05.2015 01:59
Вопросы из категории :
32x32