【问题标题】:Can variable names in Python start with an integer?Python中的变量名可以以整数开头吗?
【发布时间】:2017-01-31 16:21:47
【问题描述】:

这有点学术,但尽管如此。

Python 语法禁止以数字开头的变量名,但这可以像这样回避:

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

locals() 也是如此。

这是否意味着 Python 实际上允许它,并且它不是很明显?

编辑:

我的问题不是是否允许;我知道它在 Python 中是正式不允许的。问题是为什么我可以通过直接寻址 globals() 来解决它,如果这违反了某些规则或准则,或者如果它有充分的理由/应用程序允许这样做。

【问题讨论】:

  • 解析器不允许这样做,但你可以通过劫持globals()来做到这一点。但你并不是真的打算这样做。
  • 以后不能用它作为变量了……所以它不是真正的变量,即使它在同一个命名空间中。
  • 你的答案(重复):stackoverflow.com/questions/342152/…
  • @steffan 修改locals 不起作用[docs.python.org/3/library/functions.html#locals] 所以你只能在globals 中做这个技巧
  • @DavidW 我刚试过......它适用于 Python 3.6.0 和 2.7.13

标签: python variable-names


【解决方案1】:

Python 解析器禁止以这种方式命名变量,以便分别解析数字和变量,因为命名变量 1e1 会造成混乱 - 是数字 10.0 还是变量 1e1?

“Python,请为我输出1e1!” - “为什么是10.0?我在那边存了100个!”

但是变量实际上是以一种允许将以数字开头的字符串绑定到一个值的方式存储的,因为该功能对任何类型的哈希映射都没有害处,因此使用此“技巧”您可以在不损害解析器可分割性的情况下实现您想要的数字前缀名称变量。

我想说,从技术上讲,以这种方式命名变量不违反 Python 准则,但我们强烈建议不要这样做,而且通常是不必要的。使用globals 注入变量被认为是一种非常不好的做法,这种情况不应该是一个突出的案例。


当然,python 可以使用像字符串这样的数字的封闭符,比如*123*,但我相信发明 python 的目的是让编程更容易,而不是扩展变量命名空间的限制。


实际上,如果您必须使用以数字开头的名称,则最好使用自己的字典,而不是globals:

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

这样您就可以创建自己的变量系统 - 并避免滥用globals()。

【讨论】:

  • 我怀疑这并没有更多地实现,因为它会导致旧解析器的语法歧义(可以使用新的 PEG 解析器 (>=3.9) 来实现,但我怀疑核心开发人员会认为这是必要的补充,因此会投票反对任何提议的 PEP。
【解决方案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

【讨论】:

  • 你好,因为点赞波回来了这个问题,看到了"1a is not a real variable."这句话。虽然这是有道理的,但事实并非如此。问题不在于1a 不是“真实”变量。您不能在代码中使用它的原因是因为解析器 无法将 1a 标记为变量(如果可以,它会完美运行,因为它通常存储在 @ 987654328@)。其余的都很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 2012-05-28
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2016-02-25
相关资源
最近更新 更多