为什么Python不区分创建新的局部变量与将新值分配给现有变量?

时间:2014-09-09 03:18:15

标签: python

在Python中,x=1有两个含义,具体取决于之前是否已分配x

  1. 如果尚未分配xx=1将创建变量x
  2. 如果之前已分配x,则x=1会将x重新绑定为值1
  3. 为什么不区分这两种情况,例如,使用:==的IO语言,使用defineset!的方案来区分它们?

    Python方式有一个简单的问题,解释器不会发现拼写错误。 例如,
        message ='xxx'
        messsage ='yyy'
    在第二个声明中,我想将消息重新分配给'yyy'。但错字是一个新变量。 口译员不会发出警告或提出错误。

    我的假设是,语言设计师知道之前设计的所有语言。 方案区分了2例。 Scheme的设计远远早于Python。 后来设计的语言Ruby,CoffeeScript和Groovy(IO语言除外)与Python相同。 所以我可以说Python的设计决定是正确的。

    方案方式有两个明显的优势:1。可以找到拼写错误。 2.功能更强大。您可以轻松查看变量何时重新绑定。

    有人可以举一个例子,Scheme的选项有什么问题/不方便?

    编辑:我在这里得到了答案:answer

1 个答案:

答案 0 :(得分:1)

在Python中,x = 1的含义是,在范围的本地字典中locals()['x'] = 1,在模块全局范围的特殊情况下,globals()['x'] = 1,以及在全局范围内scope,locals()返回全局字典。

在本地引用变量时,确定它是本地变量还是(模块级别)全局变量,并且在运行时,如果不存在,则引发NameError。 (Python中没有真正的全局范围。)本地范围在赋值时具有优先权。

同样在Ruby中,本地范围具有优先权。这个惯例直观且易于理解。

在这两种语言中,这个约定规则。可以覆盖行为,但这个简单的分配使它们更容易学习和阅读。