2017-01-31 5 views
14

Это несколько академический, но тем не менее.Переменные имена в Python не могут начинаться с числа или они могут?

Синтаксис Python запрещает начинать имя переменной с номера. Но это может быть уклонился так:

>>> globals()['1a'] = 1 
>>> globals()['1a'] 
1 

Аналогично для locals().

Означает ли это, что на самом деле Python позволяет это, просто не очень заметно?

редактировать:

Мой вопрос не является ли это разрешено. Я знаю, что формально не допускается в Python. Вопрос в том, почему я могу обойти это, обратившись к globals() напрямую, и это нарушает другие правила или рекомендации, может быть, даже есть хорошая причина/приложение, чтобы это разрешить.

+2

Парсер запрещает это, но вы можете сделать это, захватив 'globals()'. Но вы на самом деле не намерены это делать. – Kevin

+7

Вы не можете использовать его как переменную позже ... так что это не настоящая переменная, хотя она находится в одном и том же пространстве имен. – tdelaney

+0

Ваш ответ (дубликат): http://stackoverflow.com/questions/342152/why-cant-variable-names-start-with-numbers – MichaelMMeskhi

ответ

11

Python анализатор запрещает называть переменные, что путь, ради чисел разбора и переменных в отдельности, как именовании переменная 1e1 создаст хаос - это номер 10.0 или переменная 1e1?

"Python, пожалуйста, выведите для меня 1e1!" - «Почему это 10,0? Я хранил 100!»

Но переменных фактически хранятся таким образом, что позволяет связывающей строку, которая начинается с числом до значения, потому что функция не будет никакой вреда в хэширования карт любого рода, и поэтому с помощью этого «трюка» вы можете достигнуть нужной переменной числовой префикс-имя, не повредив разборчивость анализатора.

Я бы сказал, что технически переименование переменных таким образом - не является нарушением руководящим принципам python, но он крайне не рекомендуется и, как правило, не нужен. Использование globals для инъекций переменных известно как очень плохая практика , и этот случай не должен быть выдающимся.


Конечно, питон мог бы использовал encloser для числительных, как строки, скажу *123*, но я считаю, что цель изобрести питон была сделать программирование проще, не выходит за пределы переменного пространства имен.


Практически говоря, если вы MUST использовать имена номер возглавляемые лучше сделать это с вашим собственным словарем, а не globals:

>>> number_headed_vars = {'1a': 100} 
>>> number_headed_vars['1a'] 
100 

Таким образом, вы можете создать свою собственную систему переменных - и избегать злоупотребления globals().

6

Это то, что вы можете и не можете сделать с этим 1a в глобальном масштабе. Вы не можете использовать его в переменной, если только вы не используете все его определение в глобальном масштабе (я имею в виду доступ к этому словарю), что делает его очень неудобным для использования (еще одна причина для этого не делать).

В принципе, 1a не является реальной переменной, как a1, как показано в следующих выходных:

>>> globals()['1a'] = 1 
>>> globals()['1a'] 
1 

>>> a = 1a 
File "<stdin>", line 1 
    a = 1a 
     ^
SyntaxError: invalid syntax 

>>> a = globals()['1a'] 
>>> a 
1 

>>> globals()['a1'] = 5 
>>> a = a1 
>>> a 
5 
+1

Привет, вернулся к этому вопросу из-за волны волнения и увидел предложение' '1a не является реальной переменной.". Хотя это имеет смысл, это неверно. Проблема не в том, что '1a' не является« реальной »переменной. Причина, по которой вы не можете использовать его в своем коде, состоит в том, что парсер ** не может подделать «1a» в качестве переменной ** (если бы он мог, он работал бы отлично, поскольку он обычно хранится в 'globals') , Остальное - все хорошо. – Uriel

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

  • Нет связанных вопросов^_^