2016-09-16 2 views
0

Я читаю the python language specification и нашел там None, True, и False токен. Я могу понять разницу между None и False с None не является boolan. Но, около True и False, почему бы и нет только BOOLEAN есть? Есть ли случаи, когда True и False ведут себя по-другому? Или есть какая-то семантическая разница?В чем разница между True и False в грамматике питона?

Обратите внимание, что я спрашиваю о различии в грамматике, а не о логическом значении, которое явно отличается.

+6

Весь 21-й век основан на различии между True и False. – Kasramvd

+2

Я не понимаю вопроса. «Истина» и «Ложь» - это разные жетоны, поэтому они оба находятся в грамматике. Вы спрашиваете, почему нет 'boolean: 'True' | «Ложное» производство? –

+1

'True' и' False' являются константами Python, поэтому считается «атомом». Не уверен, что еще вы ищете –

ответ

2

Это формализация того факта, что True и False являются специальными именами в python3: вы не можете назначать им.

Причина, по которой они не являются BOOLEAN, - это просто то, что boolean не является valid token для синтаксического анализатора.

Примечание: Вы найдете эту деталь отсутствует в грамматике python2, где вы можете фактически присвоенным именам ИСТИНА и ЛОЖЬ (... если вы хотите, чтобы посмотреть мир сгореть).

+1

И тогда вы можете 'del' их восстановить смысл! – holdenweb

+0

@holdenweb - И тогда вы можете попробовать 'del'ing их снова, но он скажет вам, что они не определены, хотя вы все еще можете использовать их и видеть, что они такие, какими они должны быть. – ArtOfWarfare

+0

Я хочу посмотреть мир, горит XD –

3
atom: ('(' [yield_expr|testlist_comp] ')' | 
     '[' [testlist_comp] ']' | 
     '{' [dictorsetmaker] '}' | 
     NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False') 

NAME, NUMBER и STRING являются маркерами, представляющих три класса маркеров. Каждый из них представляет собой неограниченный набор возможных токенов. Есть много числа литералов, которые могут быть классифицированы как NUMBER, многие строковые литералы, которые могут быть STRING s и т.д.

Есть только две булевы литералы, True и False. Знаменатель мог быть написан, чтобы классифицировать их как BOOLEAN. Возможно, но не было. Они упоминаются только один раз во всей грамматике, поэтому писать 'True' | 'False' не имеет большого значения.

1

Предположительно из ссылки, на которые вы связаны вы имеете в виде грамматические производств

atom: ('(' [yield_expr|testlist_comp] ')' | 
     '[' [testlist_comp] ']' | 
     '{' [dictorsetmaker] '}' | 
     NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False') 

Это просто даете строку None, True и False такому же статус, как и некоторые другие элементы языка. Хотя было бы возможно создать определение булевого атома, которое могло бы быть либо True, либо False и использовать это в грамматике, какую цель это послужило бы?

На самом деле, даже в 2.7 вы можете попробовать удалить определения True и False из __builtins__ имен:

>>> del __builtins__.True 
>>> del __builtins__.False 

Traceback (most recent call last): 
    File "/Users/sholden/.virtualenvs/jlab/lib/python2.7/encodings/utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
NameError: global name 'True' is not defined 

Интересно, что если удалить False первый нет никаких жалоб по поводу удаления True :-)

Однако, это делает даже вполне стандартный Python не имеет смысла вообще:

>>> 1 == 1 

Traceback (most recent call last): 
    File "/Users/sholden/.virtualenvs/jlab/lib/python2.7/encodings/utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
NameError: global name 'True' is not defined 

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

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