发布时间:2018-02-25 18:20:34编辑:admin阅读(3489)
变量作用域
python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。python的作用域一共有4种,分别是:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
x = int(2.9) # 内建作用域 g_count = 0 # 全局作用域 def outer(): o_count = 1 # 闭包函数外的函数中 def inner(): i_count = 2 # 局部作用域
举个例子
name = "Li Si" def change_name(name): print("before change:", name) #局部变量,这个函数就是这个变量的作用域 name = "Zhang San" print("after change", name) change_name(name) print(name)
执行输出
before change: Li Si
after change Zhang San
Li Si
最后一行打印的name,并没有改变。
局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就会出错
例如:
name = "Li Si" def change_name(name): print("before change:", name) #局部变量,这个函数就是这个变量的作用域 name = "Zhang San" print("after change", name) age = 23 change_name(name) print(age)
执行报错
NameError: name 'age' is not defined
全局变量
在程序的一开始定义的变量称为全局变量。
因为代码是从上往下执行的,所以全局变量,必须在程序的头部位置。
举个例子
#全局变量 city = "beijing" def change_name(name): city = "shanghai" print("before change:", name,city) #局部变量,这个函数就是这个变量的作用域 name = "Zhang San" print("after change", name) name = "Li Si" change_name(name) print(name) print(city)
执行输出
before change: Li Si shanghai
after change Zhang San
Li Si
beijing
全局与局部变量
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
上面的例子中,city变量没有受到局部变量的影响。
如果函数内部,一定要改全局变量呢?需要用global关键字声明才可以
#全局变量 city = "beijing" def change_name(name): global city city = "shanghai" print("before change:", name,city) #局部变量,这个函数就是这个变量的作用域 name = "Zhang San" print("after change", name) name = "Li Si" change_name(name) print(name) print(city)
执行输出
before change: Li Si shanghai
after change Zhang San
Li Si
shanghai
另外一种全局变量写法,不推荐这么做
def change_name(): global name name = "wang" change_name() print(name)
执行输出 wang
为什么不推荐这么做?因为只有当函数执行的时候,定义的全局变量才会改变。否则不会生效。
这种写法,要被骂街的。
函数内部修改列表
city = "beijing" names = ["jack","rose","tom"] def change_name(): names[0] = "frank" print("inside",names) change_name() print("outside",names)
执行输出
inside ['frank', 'rose', 'tom']
outside ['frank', 'rose', 'tom']
为什么都一样呢?
只有字符串,整数这种类型时,不能在函数内部更改全局变量。
稍微复杂一点的,比如列表,字典,集合,类,都是可以在函数内部更改的。
上一篇: python 函数
下一篇: python 递归与高阶函数
47618
46016
36922
34490
29100
25745
24582
19728
19270
17767
5582°
6168°
5704°
5760°
6719°
5499°
5502°
6004°
5976°
7307°