Python 当地人的绑定环境
Python binding environment on locals
在以下:
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
官方没有解释,但我能想到两个原因
- 由于
a = a + 1
是一个赋值,它指的是局部变量 a
,而不是全局变量(除非另有说明)。由于您尚未声明局部 a
,它是隐式定义的,但未初始化(类似的事情也发生在 javascript 中,并且也是混淆的常见来源)。在 C 中你不会有那种误解,它是一种静态语言,你会定义一个本地 int a
如果它存在的话。
- 在 python 中,您可以在函数
b()
中定义一个函数 c()
,它将绑定到 b
中的 a
变量,而不是全球 a
。 C 没有闭包,所以这没有用。
在以下:
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
官方没有解释,但我能想到两个原因
- 由于
a = a + 1
是一个赋值,它指的是局部变量a
,而不是全局变量(除非另有说明)。由于您尚未声明局部a
,它是隐式定义的,但未初始化(类似的事情也发生在 javascript 中,并且也是混淆的常见来源)。在 C 中你不会有那种误解,它是一种静态语言,你会定义一个本地int a
如果它存在的话。 - 在 python 中,您可以在函数
b()
中定义一个函数c()
,它将绑定到b
中的a
变量,而不是全球a
。 C 没有闭包,所以这没有用。