在Python中,x=1
有两个含义,具体取决于之前是否已分配x
:
x
,x=1
将创建变量x
。x
,则x=1
会将x
重新绑定为值1
。为什么不区分这两种情况,例如,使用:=
和=
的IO语言,使用define
和set!
的方案来区分它们?
Python方式有一个简单的问题,解释器不会发现拼写错误。
例如,
message ='xxx'
messsage ='yyy'
在第二个声明中,我想将消息重新分配给'yyy'。但错字是一个新变量。
口译员不会发出警告或提出错误。
我的假设是,语言设计师知道之前设计的所有语言。 方案区分了2例。 Scheme的设计远远早于Python。 后来设计的语言Ruby,CoffeeScript和Groovy(IO语言除外)与Python相同。 所以我可以说Python的设计决定是正确的。
方案方式有两个明显的优势:1。可以找到拼写错误。 2.功能更强大。您可以轻松查看变量何时重新绑定。有人可以举一个例子,Scheme的选项有什么问题/不方便?
编辑:我在这里得到了答案:answer
答案 0 :(得分:1)
在Python中,x = 1
的含义是,在范围的本地字典中locals()['x'] = 1
,在模块全局范围的特殊情况下,globals()['x'] = 1
,以及在全局范围内scope,locals()返回全局字典。
在本地引用变量时,确定它是本地变量还是(模块级别)全局变量,并且在运行时,如果不存在,则引发NameError
。 (Python中没有真正的全局范围。)本地范围在赋值时具有优先权。
同样在Ruby中,本地范围具有优先权。这个惯例直观且易于理解。
在这两种语言中,这个约定规则。可以覆盖行为,但这个简单的分配使它们更容易学习和阅读。