1 作用域的分类

全局变量:在文件中所有函数外部创建的变量,整个文件可见

局部变量:在函数、类等内部创建的变量且仅用在函数内部的变量;

函数的形参也是局部变量。

注:所有的变量必须是先创建,再使用。

x = 100
def func():
    x += 1
    print (' x =', x)
    return
func()

运行该段代码会报错

Traceback (most recent call last):
  File "test.py", line 6, in <module>
    func()
  File "test.py", line 3, in func
    x += 1
UnboundLocalError: local variable 'x' referenced before assignment

报错原因:变量x先使用后定义。

当一个变量已经存在于局部变量时,如果提前调用相同“名字”的变量,系统只会在局部中找该变量,但是,变量确实后定义的,就会报错。

2 四个作用域LEGB

2.1 嵌套函数(闭包) 作用域 Enclosing

也可称为非局部-非全局变量,必须在嵌套函数中使用。

当出现多个函数嵌套时,(内)二层没有找到该已定义变量,则继续在(内)三层中找,直到找到为准,当最后一层函数内仍没有找到该已定义变量,则直接报错

var = 100
def func1():
    nonlocal var
    var = 200
    print(var)
func1()

输出

  File "test.py", line 3
    nonlocal var
SyntaxError: no binding for nonlocal 'var' found

如两个嵌套函数,内层函数可能搜索外层函数的命名空间,但外层函数的命名空间对内层函数而言既非局部也非全局。

var = 100
def func1():
    var = 200
    print("func1:", var)
    def func2():
        nonlocal var
    var += 1
    print("func2:", var)
    func2()
print("func1 执行 func2 之后", var)
func1()

输出

func1 执行 func2 之后 100
func1: 200
func2: 201

该变量和全局变量一样,不能在形参中出现

2.2 内置作用域 Built-in

Python __builtin__ 模块, 包含了内建的变量/关键字等。
如内置变量和函数。 如 print

2.3全局变量global

全局变量的标志是global

def func():
    global y
    y =100
    return y

print(func())

输出结果:100

def func():
    global y
    return y

print(func())

输出结果

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    print(func())
  File "test.py", line 3, in func
    return y
NameError: name 'y' is not defined

参数y没有被定义。

global只是声明了一个变量是全局变量,但是没有对该函数定义,也即没有对该变量进行任何绑定。


def func(x):
    global x
    x = 20
    print(x)
func(20)

输出结果

  File "test.py", line 2
    global x
SyntaxError: name 'x' is parameter and global

形参变量不能强制转为全局变量

3 作用域搜索顺序

作用域搜索顺序遵循 LEGB 规则 搜, Local -> Enclosing -> Global ->Built-in 即: L>E>G>B。

本地  闭包本地   全局   内置变量

局部  闭包  全局  内置

Python学习笔记010——作用域的更多相关文章

  1. Python学习笔记010——匿名函数lambda

    1 语法 my_lambda = lambda arg1, arg2 : arg1 + arg2 + 1 arg1.arg2:参数 arg1 + arg2 + 1 :表达式 2 描述 匿名函数不需要r ...

  2. Python学习笔记010——递归函数

    1 递归定义 函数直接或间接调用函数本身,则该函数称为递归函数 2 递归特点 Python函数递归调用,会用到栈 – 这里的栈是函数/程序运行时系统为其分配的一段内存区 – 栈具有 后进先出 的特性 ...

  3. Python学习笔记010——函数文档字符串

    函数文档字符串documentation string (docstring)是在函数开头,用来解释其接口的字符串.简而言之:帮助文档 包含函数的基础信息 包含函数的功能简介 包含每个形参的类型,使用 ...

  4. Python学习笔记010——形参与实参

    在使用中忽略了一个问题,形参有些和实参类似,也不能是“关键字后面含有位置参数”,即“默认形参”后面必须不能含有“位置”形参! def test(a=100,b): print("test&q ...

  5. Python学习笔记010

    倒三角 num2 = int(input("Line:")) while num2 > 0:    num1 = num2    while num1 > 0:     ...

  6. python学习笔记之module && package

    个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, ...

  7. Python学习笔记(九)

    Python学习笔记(九): 装饰器(函数) 内置函数 1. 装饰器 1. 作用域 2. 高阶函数 3. 闭包 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就 ...

  8. Python学习笔记(七)

    Python学习笔记(七): 深浅拷贝 Set-集合 函数 1. 深浅拷贝 1. 浅拷贝-多层嵌套只拷贝第一层 a = [[1,2],3,4] b = a.copy() print(b) # 结果:[ ...

  9. Python学习笔记(八)

    Python学习笔记(八): 复习回顾 递归函数 内置函数 1. 复习回顾 1. 深浅拷贝 2. 集合 应用: 去重 关系操作:交集,并集,差集,对称差集 操作: 定义 s1 = set('alvin ...

随机推荐

  1. 多个程序对sql server中的表进行查询和插入操作导致死锁

    最近在做一个项目,是要用多个程序对sql server中的相同的数据库进行操作(查询和插入),所以在开始的时候常会出现死锁问题,后来在网上进行了咨询,发现了一些解决方法,留作大家参考: 并发去操纵一张 ...

  2. chromium中的性能优化工具syzyProf

    函数性能分析工具SyzyProf 我先开始介绍SyzyProf.这个工具可以捕获每个线程调用每个函数执行的时间,然后把结果生成一个KCacheGrind能够识别的数据格式文件,然后通过KCacheGr ...

  3. 血淋淋的事实告诉你:你为什么不应该在JS文件中保存敏感信息

    在JavaScript文件中存储敏感数据,不仅是一种错误的实践方式,而且还是一种非常危险的行为,长期以来大家都知道这一点. 而原因也非常简单,我们可以假设你为你的用户动态生成了一个包含API密钥的Ja ...

  4. Bootstrap popover弹出框

    popover被挤压.遮挡的问题: 弹出框显示的时候如果贴近一个列的边沿,就会很窄或被遮挡,解决起来很简单,只需在初始化的时候添加一个container属性就可以了: $(function (){ $ ...

  5. jQuery cssHook的经典例子

      /*--------------------------- example ------------------------------*/ $.cssHooks.foo = { get: fun ...

  6. 直接修改class文件内容即使是文本会导致App异常,正确方式是修改java再用生成的class替换掉原有的class

    前几天来了个小任务,把某项目中某人的邮件地址改了下. 由于对项目不熟悉,于是采用find方式找出app中所有包含某人邮件地址的文件都找出来了. xml,properties大约三四个,还有两个clas ...

  7. 微信小程序开发者工具下载地址

    下载地址:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html

  8. locate 命令(转)

    原文:http://www.cnblogs.com/peida/archive/2012/11/12/2765750.html locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法 ...

  9. Java从零开始学三十三(JAVA IO- File类)

    一.简述 在整个io包中,唯一表示与文件本身有关的类就是File类.使用File类可以进行创建或删除文件等常用操作.要想使用File类,则首先要观察File类的构造方法,此类的常用构造方法如下所示: ...

  10. JSTL标签引入(web基础学习笔记十八)

    一.JSTL包下载和引入 1.0.简介 JSTL全名为JavaServer Pages Standard Tag Library 1.1.下载包 下载地址:http://archive.apache. ...