Имена переменных в Python не могут начинаться с числа или они могут?

Это несколько академический, но тем не менее.

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

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

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

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

изменить

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

Ответы

Ответ 1

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

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

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

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


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


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

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

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

Ответ 2

Это то, что вы можете и не можете сделать с этим 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