【发布时间】:2021-06-21 14:34:03
【问题描述】:
如下:
a = 3
def b():
# global a; // will error without this statement
a = a + 1
print a
除非我添加global,否则它会出错。从这个意义上说,python 似乎首先评估表达式的 LHS(为a 创建一个新的本地)而不是先评估 RHS(等于 4)然后将其分配给本地 a。换句话说,比如:
local a <-- local a + 1
^
doesnt exist so look up in parent environment
local a <-- global a + 1
local a <-- 3 + 1
我只是好奇为什么在 python 中没有默认使用这种方法。例如,在 C 中它使用这种模式:
// file.c
#include <stdio.h>
int a=3;
int main(void)
{
a = a + 1;
printf("%d\n", a);
}
$ gcc file.c -o file; ./file
4
【问题讨论】:
-
" 从这个意义上说,python 似乎首先评估表达式的 LHS(为 a 创建一个新的本地)而不是 RHS 首先(等于 4)“不,发生的是 compiler 将
a标记为本地,因此当您在表达式a += 1中引用a时,它会引发错误,因为未定义该本地变量。默认分配给全局变量会很糟糕。 Python 没有像 C 那样的变量声明,因此它使用一个简单的规则来解决这种歧义。注意,行为相反的语言是 JS,默认全局被认为是一个巨大的问题。 -
注意,在 Python 中有一种情况,您可以执行类似
a = a + 1的操作,其中a分配给本地范围并使用全局范围中的a(如果存在),并且那是在类定义中,所以在里面,说一个class Foo: ...,如果你这样做a = a + 1,它将分配给类主体的本地a,但它将使用global a作为a + 1(没有其他a已在类块中分配)