Python命名空间的问题

初学Python,遇到自己练习的时候遇到这么一个问题

i = 1
def func():
    i = i + 1
func()

这段代码显示'Using variable i before assignment'
为什么func()里不能访问到全局的i呢?

阅读 3.5k
4 个回答

反对楼上
不使用global 关键字,函数内也能访问外部变量

这个问题的错误在于,函数内本地作用域隐形声明了一个变量,但是访问前没有初始化。

x = 0
def f():
    tmp = x + 1 # 调用本地变量
    x = tmp # 声明本地变量并初始化
f()

上面这段代码会报错,因为:
无论你在函数内任何地方初始化变量,进入函数的时候都会隐形声明一个本地变量,哪怕是初始化之前调用的,依然是本地变量

x = 0
def f():
    tmp = x + 1 # 只是读取外部变量没问题
    return tmp
f()

global 关键字是指定变量使用全局作用域那个,不需要在本地作用域声明一个新的

func()里 可以访问全局变量i,但不能给i重新赋值

i = 1
def func():
    print( i + 1)
func() # 2

global声明后,可以给i重新赋值

i = 1
def func():
    global i
    i = i + 1
    print(i)
func() # 2

Python的标准里,全局作用域里定义的函数不能访问全局变量,但可以通过global 声明来使用;

i = 1
def func():
    global i
    i = i + 1
func()

函数内部是可以访问全局变量的,如下代码你会发现id是一样的,查找规则遵循LEGB

i = 1
print(id(i))
def func():
    print(id(i))

func()

但是在函数体内,如果出现了绑定操作即i=1则python认为i是一个局部变量,因此你上面的写法会报错,即引用出现在赋值定义之前。
但是如果你一定要这么做,因为你希望指向的是其实一个全局变量,则需要添加global声明才可以:

i = 1
print(id(i))
def func():
    global i
    print(id(i))
    i += 1

func()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题