Python中的作用域

2016-10-08  本文已影响38人  Rokkia

全局变量,局部变量

作用域是一个很神奇的东西,这将会导致,看似是同一个变量的值,产生奇特的效果。

如:
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。这里在闭包还会有说明。

本文只是对自己平时学习的总结,如有不对的地方,还望各位指出,一起交流学习

上一篇 下一篇

猜你喜欢

热点阅读