本地人的 Python 绑定环境

问题描述

以下内容

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中,您可以在函数c()中定义一个函数b(),它将绑定到a中的b变量,而不是全局a . C 没有闭包,所以这没有用。