Python学习笔记010——作用域
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——作用域的更多相关文章
- Python学习笔记010——匿名函数lambda
1 语法 my_lambda = lambda arg1, arg2 : arg1 + arg2 + 1 arg1.arg2:参数 arg1 + arg2 + 1 :表达式 2 描述 匿名函数不需要r ...
- Python学习笔记010——递归函数
1 递归定义 函数直接或间接调用函数本身,则该函数称为递归函数 2 递归特点 Python函数递归调用,会用到栈 – 这里的栈是函数/程序运行时系统为其分配的一段内存区 – 栈具有 后进先出 的特性 ...
- Python学习笔记010——函数文档字符串
函数文档字符串documentation string (docstring)是在函数开头,用来解释其接口的字符串.简而言之:帮助文档 包含函数的基础信息 包含函数的功能简介 包含每个形参的类型,使用 ...
- Python学习笔记010——形参与实参
在使用中忽略了一个问题,形参有些和实参类似,也不能是“关键字后面含有位置参数”,即“默认形参”后面必须不能含有“位置”形参! def test(a=100,b): print("test&q ...
- Python学习笔记010
倒三角 num2 = int(input("Line:")) while num2 > 0: num1 = num2 while num1 > 0: ...
- python学习笔记之module && package
个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, ...
- Python学习笔记(九)
Python学习笔记(九): 装饰器(函数) 内置函数 1. 装饰器 1. 作用域 2. 高阶函数 3. 闭包 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就 ...
- Python学习笔记(七)
Python学习笔记(七): 深浅拷贝 Set-集合 函数 1. 深浅拷贝 1. 浅拷贝-多层嵌套只拷贝第一层 a = [[1,2],3,4] b = a.copy() print(b) # 结果:[ ...
- Python学习笔记(八)
Python学习笔记(八): 复习回顾 递归函数 内置函数 1. 复习回顾 1. 深浅拷贝 2. 集合 应用: 去重 关系操作:交集,并集,差集,对称差集 操作: 定义 s1 = set('alvin ...
随机推荐
- [转]【Delphi】 Thread.Queue与Synchronize的区别
前话: 其实大家要学会看源码, 我接下来要说的这些东东,与其等别人讲,还不如自己搞几个代码试一下,印象还深刻点 TThread.Queue和TThread.Synchronize的区别,效果上:二者 ...
- 动态图片 Movie android-gif-drawable GifView
Movie 类 文档位置:/sdk/docs/reference/android/graphics/Movie.html 官方对这个类连一句介绍都没有,并且所有的方法也没有一行注释,可见多么不受重视! ...
- JS中应用正则表达式转换大小写
JS中应用正则表达式转换大小写,代码很简单,看代码: 以下首字母大写,其它字母小写 <script type="text/javascript"> function r ...
- 独特的deadlock(仅update语句也能造成死锁)
最近遇到了一个看上去很奇怪,分析起来很有意思的死锁问题.这个死锁看上去难以理解.而分析过程中,又使用了很多分析SQL Server死锁的典型方法.记录下来整个分析过程还是很有意义的. 问题重现步骤: ...
- 【Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之中的一个】环境搭建
* 确定你安装了Android NDK R9B 版本号 ,假设没有前往下面地址下载. ( https://dl.google.com/android/ndk/android-ndk-r9b-linux ...
- BFC是什么
BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...
- C++:fread、fwrite函数用法
主要内容: fread.fwrite函数的用法 1.函数功能 用来读写一个数据块. 2.一般调用形式 fread(buffer,size,count,fp); fwrite(buffer,size,c ...
- AutoPlay Menu Builder入门教程
1 拖动窗口可以设置主界面的窗口大小,在下面有版面预览 2 常用东西介绍.右侧的素材库除了按钮还有图像,背景,音乐等.使用按钮的时候选中需要的按钮样式,双击即可上屏.图形按钮即使可以使用图像作为背景的 ...
- UVa 10820 - Send a Table
题目:找到整数区间[1.n]中全部的互质数对. 分析:数论,筛法,欧拉函数.在筛素数的的同一时候.直接更新每一个数字的欧拉函数. 每一个数字一定会被他前面的每一个素数筛到.而欧拉函数的计算是n*π(1 ...
- c的链接详解
多目标文件的链接 stack.c #include <stdio.h> #define STACKSIZE 1000 typedef struct stack { int data[STA ...