首页 > 解决方案 > 本地人的 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

标签: pythonpython-internals

解决方案


官方没有解释,但我能想到两个原因

  • 由于a = a + 1是一个赋值,它指的是局部变量 a,而不是全局变量(除非另有说明)。由于您尚未声明 local a,因此它是隐式定义的,但未初始化(类似的事情也发生在 javascript 中,也是常见的混淆来源)。在 C 中,您不会有这种误解,它是一种静态语言,int a如果存在,您将定义一个本地语言。
  • 在 python 中,你可以在 function 中定义一个函数c()b()它会绑定到a里面的变量b,而不是全局的a。C没有闭包,所以这没有用。

推荐阅读