一、变量作用域

当程序定义一个变量时,这个变量是有它的作用范围的,变量的作用范围称为变量的作用域。根据变量的位置,分为两种:

  • 局部变量:局部变量就是在函数中定义的变量,包括参数,都是局部变量,局部离开函数后,将不能被访问。
  • 全局变量:不在函数内定义、全局范围内定义的变量,都是全局变量,全局变量可以在所有函数中被访问。

在Python中,提供了三个工具函数获取指定范围内变量和值组成的字典。

  • globals():返回当前作用域全局变量的字典;无论在哪里使用,都会获取全局变量。
  • locals():返回包含当前范围的局部变量的字典;当在全局范围内使用,会获取全局范围内所有变量组成的字典。
  • vars():当没有参数时,相当于locals();有一个参数时,相当于object.__dict__。

使用globals()和locals()获取全局变量时,不应该被修改,修改会改变全局变量本身。而locals()获取局部变量时,即使修改了,也不会对局部变量产生影响。

globals(),例:

a = 1
def test():
  b = 2
  print (globals()) test()
# 打印全局变量 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 1, 'test': <function test at 0x0000000002EAC1E0>} globals()
# 打印全局变量 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 1, 'test': <function test at 0x0000000002EAC1E0>}

  

locals(),例:

a = 1
def test():
b = 2
print (locals()) test()
# 打印局部变量 {'b': 2} print (locals())
# 打印全局变量 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 1, 'test': <function test at 0x0000000002EAC1E0>}  

vars(),例:

class test01:
k1 = 1
def test02():
k2 = 2
print (vars())
k3 = 3 test01.test02()
# 打印test02()的局部变量 {'k2': 2} print (vars())
# 打印全局变量 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'test01': <class '__main__.test01'>, 'k3': 3} print (vars(test01))
# 打印类的属性 {'__module__': '__main__', 'k1': 1, 'test02': <function test01.test02 at 0x00000000023892F0>, '__dict__': <attribute '__dict__' of 'test01' objects>, '__weakref__': <attribute '__weakref__' of 'test01' objects>, '__doc__': None} print (test01.__dict__)
# 打印类的属性 {'__module__': '__main__', 'k1': 1, 'test02': <function test01.test02 at 0x00000000023892F0>, '__dict__': <attribute '__dict__' of 'test01' objects>, '__weakref__': <attribute '__weakref__' of 'test01' objects>, '__doc__': None}

 

全局变量虽然可以被所有函数访问,但是如果在函数内定义了与全局变量同名的变量,就会发生局部变量遮蔽全局变量的情况,例:

a = 1
def test():
print (a) test()
# 运行成功,打印 1 def test02():
a = 2
print (a) test02()
# 函数内部对不存在的变量赋值,会重新定义新的局部变量,打印 2 def test03():
print (a)
a = 3 test03()
# 报错UnboundLocalError: local variable 'a' referenced before assignment,由于a=3这段代码重新定义了局部变量,所以a全局变量被遮蔽。

 

二、使用global语句在函数中声明全局变量 

为了避免在函数中对全局变量赋值,可以通过global语句声明全局变量。

例:

a = 1
def test():
  # 声明a是全局变量,后面的语句将不会重新定义局部变量
  global a
  print (a) # 打印 1
  # 对全局变量进行赋值
  a = 2 test()
# 打印 1 print (a)
# 打印 2 

三、局部函数

前面我们看到的都是全局函数,我们还可以在函数体内定义函数,这称为局部函数,局部函数在默认情况下,对外部是隐藏的,只能在其封闭函数内有效,如果想在其他作用域中使用局部函数,其封闭函数可以返回局部函数。

例:

# test()函数根据不同的参数,选择调用不同的局部函数
def test(x):
def a(x):
return x * x
def b(x):
return x
if x != 0:
return a(x)
else:
return b(x) print (test(2))
# 打印 4
print (test(0))
# 打印 0

  

局部函数的变量也会遮蔽他所在函数的局部变量,例:

def test01():
a = 1234
def test02():
print (a)
a = 4321
test02() test01()
# 报错 UnboundLocalError: local variable 'a' referenced before assignment  

上面的代码中,由于在test02()函数中重新定义了新的局部变量a,test02()函数中定义的局部变量a遮蔽了他所在函数test01()中的局部变量a,我们可以通过nonlocal语句声明访问赋值语句只是访问该函数所在函数的局部变量。

注意,nonlocal语句只能在嵌套函数中使用,并且在外层函数中必须定义了相关的局部变量,否则会报错。

例:

def test01():
a = 1234
def test02():
nonlocal a # 声明a是test01()的局部变量
print ('01',a)
a = 4321 # 改变外层函数局部变量的值
print ('02',a)
print ('03',a)
test02()
print ('04',a) test01()
# 打印
# 03 1234
# 01 1234
# 02 4321
# 04 4321

Python——函数入门(三)的更多相关文章

  1. 3.Python爬虫入门三之Urllib和Urllib2库的基本使用

    1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS.CSS ...

  2. 转 Python爬虫入门三之Urllib库的基本使用

    静觅 » Python爬虫入门三之Urllib库的基本使用 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器 ...

  3. python函数入门到高级

    函数的定义: def test(x): "The function definitions" x+=1 return x def:定义函数的关键字 test:函数名 ():内可定义 ...

  4. Python函数(入门6)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6407970.html 本文出自:[Edwin博客园] Python函数 1. Python之调用函数 pri ...

  5. RobotFramework + Python 自动化入门 三 (Web自动化)

    在<RobotFramwork + Python 自动化入门 一>中,完成了一个Robot环境搭建及测试脚本的创建和执行. 在<RobotFramwork + Python 自动化入 ...

  6. Python 函数(三)

    Python 3 函数 (闭包.装饰器.递归.高阶函数) 一.闭包 内部函数可以引用外部函数的参数和局部变量,当外部函数返回内部函数时,相关参数和变量 都保存在返回的函数中,简单的说,这种内部函数可以 ...

  7. python函数入门

    知识内容: 1.函数的作用 2.函数的定义与调用 3.函数的返回值 4.函数的参数 5.局部变量与全局变量 6.作用域 一.函数的作用 1.复用代码 将可能重复执行的代码封装成函数,并在需要执行的地方 ...

  8. Python——函数入门(一)

    一.理解函数 举一个例子,当我们需要重复使用一个功能的时候,不可能每次都去复制一次代码,这个时候就需要用到函数了,所谓的函数,简单来说就是给函数取一个名字,当需要用到这个功能的时候,就可以通过这个名字 ...

  9. Python——函数入门(二)

    一.函数的参数 我们在定义函数时,可以定义形式参数(简称形参),这些形参的值在函数调用的时候才会确定,形参的值由调用者负责传入. 1.关键字参数 在Python中,函数的参数名并不是没有意义的,在调用 ...

随机推荐

  1. ALSA声音编程

    1. ALSA设备驱动将ALSA设备描述分为四层,从上到下为: default default:0 plughw:0,0 hw:0,0 不同的层次,对设备的控制权限不同,比如hardware para ...

  2. 视图、存储函数、存储过程、触发器:MySQL系列之五

    一.视图 视图:VIEW,虚表,保存有实表的查询结果,实际数据不保存在磁盘 物化视图:实际数据在磁盘中有保存,加快访问,MySQL不支持物化视图 基表:视图依赖的表 视图中的数据事实上存储于" ...

  3. Java基础笔记(十四)——封装

    封装(好比ATM机) 将类的某些信息隐藏在类内部,不允许外部程序直接访问(隐藏对象的信息),通过该类提供的方法来实现对隐藏信息的操作和访问(留出访问的接口). 特点: 1.只能通过规定的方法访问数据. ...

  4. 小程序启用slot -- 传入 wxml标签

    options:{ multipleSlots:true } 直接看:https://www.jianshu.com/p/b22c9e075931

  5. 从输入URL到浏览器显示页面

    去看经典是不会错的,如果觉得太长,那就休息一下继续看. 经验告诉我,读一篇经典足矣,不要浪费时间去搜索其他地方到处复制粘贴的博文. 所以奉上我过滤的经典: 1.How browser work 2.h ...

  6. EIGRP-6-EIGRP数据包

    EIGRP在与邻居路由器进行通信时,使用以下7种不同类型的数据包:   Hello包 确认包 更新包 查询包 响应包 SIA查询包 SIA响应包   更新包,查询包,响应包,SIA查询包和SIA响应包 ...

  7. n个点的基环树数量

    某裴姓蒟蒻上午提了一个小问题(rt)..然后他升华了..升华之前感受到了神犇的力量... 方法一: g[n][k]表示n个点,k条边的无向图(不一定连通) f[n][k]表示表示n个点,k条边的无向连 ...

  8. CMD当前代码页修改

    python3.x在程序开发中统一的编码是 UTF-8,但是进行交互式编程的时候会经常遇到乱码问题,这是因为Window cmd的默认编码是GBK.与程序采用的 UTF-8 不一致造成的中文及特殊字符 ...

  9. 影子内存(Shadow RAM)介绍_4

    影子内存(Shadow RAM,或称ROM shadow)是为了提高系统效率而采用的一种专门技术.它把系统主板上的系统ROM BIOS和适配器卡上的视频ROM BIOS等拷贝到系统RAM内存中去运行, ...

  10. Spark Mllib里的协调过滤的概念和实现步骤、LS、ALS的原理、ALS算法优化过程的推导、隐式反馈和ALS-WR算法

    不多说,直接上干货! 常见的推荐算法 1.基于关系规则的推荐 2.基于内容的推荐 3.人口统计式的推荐 4.协调过滤式的推荐 (广泛采用) 协调过滤的概念 在现今的推荐技术和算法中,最被大家广泛认可和 ...