初学Python,遇到自己练习的时候遇到这么一个问题
i = 1
def func():
i = i + 1
func()
这段代码显示'Using variable i before assignment'
为什么func()里不能访问到全局的i呢?
初学Python,遇到自己练习的时候遇到这么一个问题
i = 1
def func():
i = i + 1
func()
这段代码显示'Using variable i before assignment'
为什么func()里不能访问到全局的i呢?
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()
4 回答4.5k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
1 回答4.4k 阅读✓ 已解决
1 回答3.9k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
反对楼上
不使用global 关键字,函数内也能访问外部变量
这个问题的错误在于,函数内本地作用域隐形声明了一个变量,但是访问前没有初始化。
上面这段代码会报错,因为:
无论你在函数内任何地方初始化变量,进入函数的时候都会隐形声明一个本地变量,哪怕是初始化之前调用的,依然是本地变量
global 关键字是指定变量使用全局作用域那个,不需要在本地作用域声明一个新的