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 没有闭包,所以这没有用。