page contents

python3:变量作用域及global,nonlocal的用法

在Python程序中声明、改变、查找变量名时,都是在一个保存变量名的命名空间中进行中,此命名空间亦称为变量的作用域。python的作用域是静态的,在代码中变量名被赋值的位置决定了该变量能被访问...

Python程序中声明、改变、查找变量名时,都是在一个保存变量名的命名空间中进行中,此命名空间亦称为变量的作用域。python的作用域是静态的,在代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定.

变量作用域之LENGB


L = Local     局部作用域

E = Enclosing 嵌套作用域

N = nonlocal  只作用于嵌套作用域,而且只是作用在函数里面

G = global    全局作用域

B = Built-in  内置作用域

python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量.


下面讲分别举例说明:

1. L = Local     局部作用域

局部变量包含在def定义的函数体内。在函数体内声明的变量,默认都是局部变量,除非有特别说明,如全局变量的声明要用关键字global.


def testlocal():

    x = 123 # x即为局部变量

print(x)

以上代码运行就会报NameError, 因为x是个局部变量,在函数外要print(x), 按照上面python引用变量的顺序,是找不了x变量的,故为报错. 


NameError: name 'x' is not defined

1.1 再举一例:


x = 123

def testlocal():

    print(x)

 

testlocal()

以上代码运行结果为123, 因为按照上面python引用变量的顺序,是找不到x变量的,故会向外层作用域找,就会找到x=123


1.2 如果将代码改为:


x = 123

def testlocal():

    print(x)

    x = 100

 

testlocal()

这时以上代码运行就会报错. 


UnboundLocalError: local variable 'x' referenced before assignment

什么原因?新手常会遇到这类问题, 因为按照python引用变量的顺序,当print(x)时,就会先在函数体内查找x,能找到,但在他的下一行,故为在声明前被引用是不对的.  

 


2. G = global    全局作用域

全局作用域的变量怎么用呢?

先看实例:


x = 123

def testGlobal():

    print(x)

    x = 100

    

testGlobal()

这就是上面1.2的实例,会报错,如果将其为:


x = 123

def testGlobal():

    global x

    print(x)

    x = 100

    

testGlobal()

试试看,结果运行结果为123, 是不会报错的,自已体会一下吧. 


3. nonlocal的用法

这个一般是用在闭包函数里. 实例如下:


x = 123

def outer():

    x = 100

    def inter():

        x = 200

    inter()

    print(x)

    

func()

运行的结果为100, 那如果要求inter中对x的修改是有效的,必须加上关键字nonlocal


x = 123

def outer():

    x = 100

    def inter():

        nonlocal x

        x = 200

    inter()

    print(x)

    

func()

运行的结果为200, 符合预期.


4. 其它.

python变量的作用域只在作用域内有效,需要注意的是,在if-elif-else, for-in, while, try-except-finally这些关键字中并不会产生特定的作用域,如下:


#!/user/bin/python3

#-*- coding:utf-8 -*-

 

for i in range(10):

    i = i + 1

print(i)

>>>10

运行结果并不会报错,会输入i, 这里的i就是一个全局变量,这是python的一个特点,如果在C/java中这种写法就会报错,会报变量i会声明。


  • 发表于 2020-01-17 09:45
  • 阅读 ( 492 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章