这在某种程度上是学术性的,但不过。
Python语法禁止使用数字启动变量名称。但这可以这样回避:
>>> globals()['1a'] = 1
>>> globals()['1a']
1
同样适用于locals()
。
这是否意味着,Python实际上允许它,只是不是很明显?
修改
我的问题不是,是否允许。我知道,它在Python中是正式不允许的。问题是为什么我可以通过直接解决globals()
来解决这个问题,并且这会破坏其他规则或指导方针,甚至可能有一个很好的理由/应用程序来允许它。
答案 0 :(得分:18)
Python解析器禁止以这种方式命名变量,为了分别解析数字和变量,因为命名变量1e1
会产生混乱 - 是数字10.0
还是变量{{1 }}?
" Python,请为我输出1e1
!" - "为什么是10.0?我在那里存储了100个!"
但变量实际上是以允许将以数字开头的字符串绑定到某个值的方式存储的,因为该功能对任何类型的散列映射都没有害处,所以使用这个"特技"你可以实现你想要的数字prefixed-name变量而不会损害解析器的可分割性。
我认为从技术上讲,以这种方式命名变量对于python准则来说并不违反,但是它非常气馁,而且通常是不必要的。使用1e1
注入变量被称为非常不良做法,这种情况不应该是未完成的。
当然,python可以使用封装器来表示字符串,例如globals
,但我相信发明python的目的是使编程更容易,而不是扩展变量命名空间的限制。
实际上,如果必须使用数字标题,最好使用自己的字典,而不是*123*
:
globals
这样您就可以创建自己的变量系统 - 并避免滥用>>> number_headed_vars = {'1a': 100}
>>> number_headed_vars['1a']
100
。
答案 1 :(得分:7)
这是你可以和不能用全局变量中的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