变量作用域
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']
为什么都一样呢?
只有字符串,整数这种类型时,不能在函数内部更改全局变量。
稍微复杂一点的,比如列表,字典,集合,类,都是可以在函数内部更改的。