全局变量,局部变量
作用域是一个很神奇的东西,这将会导致,看似是同一个变量的值,产生奇特的效果。
如:
x = 10
def print_x(x):
x += 1
print x
我们创建了一个函数,在函数中我们改变x的值,然后看看会有什么效果呢
print_x(x)
x
打印结果
11
10
11是函数中的print x 打印出来的,10是x打印出来的。我明明在函数中修改了x的值,为什么没有修改呢?这就是作用域在作怪。当你创建一个函数的时候,同事就会创建一个新的作用域。
于是,虽然看似函数内外都是x,但是本质还是不一样的。在函数内部创建的变量叫做局部变量。在函数外的变量叫做全局变量
我们可以通过vars()这个函数来查看当前作用域里的变量
scope = vars()
scope
当你打印scope的时候,会发现,scope本质是一个字典,里面包含了你声明的变量的名字和值,如:
scope['x']
10
当你调用scope['x']时,就会返回x对应的值
如果你细心的话,你还会发现有这样一行
'print_x': <function __main__.print_x>
这说明什么呢,你创建的函数,在Python中也会默认声明为全局变量,同事print_x 对应的类型是function。
函数中使用变量使用
函数中全局变量的使用:
虽然在函数中会产生一个新的作用域,但是函数中还是可以使用全局变量的,如:
def print_y(y):
print y + x #x我们使用之前设置的10
print_y(20)
30
仔细观察我们可以直接使用x的值,为什么在print_x中不行呢,主要是当你在局部变量中命名跟全局变量有重名的时候,就不会使用全局变量,当没有重名时,则可以使用。
但是让我们看看下面这种情况
def print_y(y):
x += 1
print y + x #x我们使用之前设置的10
print_y(20)
UnboundLocalError: local variable 'x' referenced before assignment
你会发现,无情报错了,因为函数中可以使用全局变量,但是不能改变,如果想要在函数中改变x的值,你需要在函数中,使用global(全局)来定义这个变量,让其变为全局的。
如:
def print_y(y):
global x
x += 1
print y + x #x我们使用之前设置的10
print_y(20)
30
x
11
没有任何问题,在函数内部改变同时,全局变量也改变了。
关于局部变量的一个使用,闭包
闭包的使用正是使用了函数变量的作用域
如:
def func(params):
def funcInfunc(num):
print vars()
return params + num
return funcInfunc #前面提到过 ,vars()中函数也会被认为是一个变量,所以我们可以返回这个函数
使用
funa = func(2)
sum = funa(3)
{'num': 3, 'params': 2}
sum
5
在这我们可以发现在funcInfunc中的vars返回的字典中,包含了num与params,在funcInfunc中保存了params的值,所以结果会是5。这里在闭包还会有说明。
网友评论