2016-04-26 2 views
0

Этот код должным образом флаги ошибку:используя неопределенную переменную в питона

print "Value b and tab: ", b,"\t-" 
b=1 
print "Value b and tab: ", b,"\t-" 

. 

NameError: name 'b' is not defined 

Но с помощью этого кода, где запятая была забыта на вкладке, не сделать то же самое:

print "Value b and tab: ", b"\t-" 
b=1 
print "Value b and tab: ", b"\t-" 

Что это мышление питона, когда он видит b"\t-"? И почему он не распечатывает значение b, даже если он назначен?

ответ

7

b'...' является строка байт буквальным в Python 3.

В Python 2, что является псевдонимом для обычной строки, для совместимости форвардов с Python 3. См Python 2.6 Что нового документа, в частности, PEP 3112: Byte Literals раздел:

Python 3.0 adopts Unicode as the language’s fundamental string type and denotes 8-bit literals differently, either as b'string' or using a bytes constructor. For future compatibility, Python 2.6 adds bytes as a synonym for the str type, and it also supports the b'' notation.

и раздел в лексическом анализе главы справочной документации Python String literals:

A prefix of 'b' or 'B' is ignored in Python 2; it indicates that the literal should become a bytes literal in Python 3 (e.g. when code is automatically converted with 2to3).

Поскольку в Python 2 синтаксис создает обычную строку Python, эхо-значение после этого показывает стандартный синтаксис строки без префикса b.

1

Причина, по которой это происходит, заключается в том, что b перед строковым литералом интерпретируется как команда для интерпретации строки как строка байт. Таким образом, b'...' сильно отличается от строкового литерала строки '...'.

Это очень распространены, и не ограничивается только 'B':

  • r'...' интерпретируется как сырой строки.
  • u'...' интерпретируется как строка Юникод.

и так далее.

В основном старайтесь избегать добавления символов к символам Python, так как они могут полностью изменить типы данных.

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