Python-关于python函数作用域的问题?

Python-关于python函数作用域的问题?

灵芸 发布于 2017-08-15 字数 252 浏览 1085 回复 3

新手,遇到一个这样的问题

a=1
def func()
print a #1
————————————————
def func()
a=a+1 #error unBoundError
————————————————
def func()
global a
a=a+1 #ok

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

灵芸 2017-09-16 3 楼

建议去看下《python简明教程》,对于函数里面的局部变量,需要进行初始化

 def func() :
a=0 #对局部变量a进行初始化,这样可以对全局变量a进行覆盖
a=a+1

这样是没有问题的。
而对于函数里面的global变量,我们需要声明它是global a,但是不能对它进行初始化,因为它已经在函数外面进行了定义,我们只能说明它是一个全局的变量

想挽留 2017-09-08 2 楼

Python和JavaScript比较相似,只有全局变量和函数的局部变量。
1. 如果函数里去读一个变量,而这个变量在当前函数的局部变量中找不到,就会全局变量中找。
2. 如果函数里去写一个变量(赋值),这个变量必须是局部变量。如果要写全局变量,需要加global声明。

浮生未歇 2017-08-22 1 楼

看看经过编译后的字节码,你会明白。
主要的不同在于编译过程中会对当前作用域(函数体内)的变量操作进行解析,如果有赋值,就会在当前作用域创建变量(覆盖掉global引用),而没有创建,则会引用全局变量(即便该变量可能不存在)

In [22]: def a(): return c
In [23]: def b(): c = c + 1
In [24]: import dis
In [25]: dis.dis(a)
1 0 LOAD_GLOBAL 0 (c)
3 RETURN_VALUE

In [26]: dis.dis(b)
1 0 LOAD_FAST 0 (c)
3 LOAD_CONST 1 (1)
6 BINARY_ADD
7 STORE_FAST 0 (c)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE