python的作用域

作用域也叫名字空间,是访问变量时查找变量名的范围空间

python中的四个作用域 LEGB

作用域 英文解释 英文缩写
局部作用域 Local(function) L
外部嵌套函数作用域 Enclosing Function local E
函数定义所在模块(文件)的作用域 Global(module) G
Python内建模块的作用域 Builtin(python) B

示例:

# 此示例示意作用域
v = 100
def f1():
v = 200
print("f1.v=", v)
def f2():
v = 300
print("f2.v=", v)
f2()
f1()
print("v=", v)

变量名的查找规则

L ---> E ---> G ----> B

注:

在默认的情况下,变量名赋值会创建或改变当前作用域

内变量的绑定关系

global语句

作用:

告诉解释执行器,global语句声明的一个或多个变量
这些变量的作用域为模块级的作用域,也称为全局变量
全局声明(global)将赋值语句的变量映射到模块文件内部的作用域

语法:

global 变量名1
global 变量名1,变量名2,....

示例:

# 此示例示意global语句的语法和用法
v = 100
def f1():
global v # global声明v为全局变量
v = 200 # 想让此赋值语句去修改全局变量v f1()
print('v=', v) # 200

说明:

全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为是局部变量)

全局变量在函数内部不经过声明就可以直接访问(取值)

不能先创建局部变量,再用global声明为全局变量,此种做法不符合规则

global变量列表里的变量名不能出现在函数的形参列表里

nonlocal语句

作用:

告诉解释器,nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量

语法:

 nonlocal 变量名1, 变量名2, ....

示例:

# 此示例示意nolocal 语句的语法和用法
v = 100
def f1():
v = 200
print("f1.v=", v)
def f2():
nonlocal v
v = 300
print("f2.v=", v)
f2()
print("f1.v=", v)
f1()
print("全局的v=", v)

说明:

nonlocal语句只能在被嵌套函数内部进行使用
对nonlocal变量进行赋值将对外部嵌套函数作用域内的变量进行操作
当有两层或者两层以上函数嵌套时,访问nonlocal变量只对最近的一层变量进行操作
nonlocal语句的变量列表里的变量名不能出现在此函数的形参列表中

def 语句的作用是创建函数

lambda 表达式(又称匿名函数)

作用:

    创建一个匿名函数对象
同def 类似,但不提供函数名

语法:

 lambda [函数形参列表]: 表达式

示例:

# 此示例示意lambda 表达式的语法和用法
# def myadd(x, y):
# return x + y # 用lambda表达式来创建上面的函数
myadd = lambda x, y: x + y print("20+30=", myadd(20, 30)) # 50
print("4 + 5 =", myadd(4, 5)) # 9

说明:

   1. lambda 表达式创建的函数只能包含一条表达式
2. lambda 比函数简单,且可以随时创建和销毁,有利于
降低程序的偶合度

eval函数和exec() 函数

eval(source, global=None, local=None), 把一个

字符串source 当成一个表达式来执行,返回表达式执

行后的结果

exec(source, global=None, local=None) 把一个

字符串source当成程序来执行

Python开发【第十二篇】python作用域和global nonlocal的更多相关文章

  1. 图解Python 【第十二篇】:Django 基础

    本节内容一览表: Django基础:http://www.ziqiangxuetang.com/django/django-tutorial.html 一.Django简介 Django文件介绍:ht ...

  2. Python开发【十二章】:ORM sqlalchemy

    一.对象映射关系(ORM) orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却 ...

  3. python【第十二篇下】操作MySQL数据库以及ORM之 sqlalchemy

    内容一览: 1.Python操作MySQL数据库 2.ORM sqlalchemy学习 1.Python操作MySQL数据库 2. ORM sqlachemy 2.1 ORM简介 对象关系映射(英语: ...

  4. python【第十二篇】Mysql基础

    内容: 1.数据库介绍及MySQL简介 2.MySQL基本操作 1 数据库介绍 1.1什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同 ...

  5. Python 学习 第十二篇:pandas

    pandas是基于NumPy构建的模块,含有使数据分析更快更简单的操作工具和数据结构,最常用的数据结构是:序列Series和数据框DataFrame,Series类似于numpy中的一维数组,类似于关 ...

  6. 第十二篇 Python函数之全局变量&局部变量&递归函数

    全局变量:在定义的时候,顶头写的,没有任何缩进的变量就是全局变量. 全局变量的特点:在当前文件里的任何地方都可以进行调用 局部变量:在子程序里定义的变量,就是局部变量. 子程序:比如.py文件里,写的 ...

  7. Python学习第十二篇——切片的使用

    Python中使用函数切片可以创建副本,保留原本.现在给出如下代码 magicians_list = ['mole','jack','lucy'] new_lists = [] def make_gr ...

  8. python基础-第十二篇-12.1jQuery基础与实例

    一.查找元素 1.选择器 基本选择器 $("*") $("#id") $(".class") $("element") ...

  9. Swift开发第十二篇——protocol组合&static和class

    本篇分为两部分: 一.Swift 中 protocol 组合的使用 二.Swfit 中 static和class 的使用 一.Swift 中 protocol 组合的使用 在 Swift 中我们可以使 ...

  10. PowerBI开发 第十二篇:钻取

    钻取是指沿着层次结构(维度的层次)查看数据,钻取可以变换分析数据的粒度.钻取分为下钻(Drill-down)和上钻(Drill-up),上钻是沿着数据的维度结构向上聚合数据,在更大的粒度上查看数据的统 ...

随机推荐

  1. Wpf DataGrid动态添加列,行数据(二)

    这是第二中方法,可直接绑定,我这里只是做出了一种思路,并不是最完美. 这里注意一下,因为我里面引用了MVVMLight,所以可能代码不是复制过去就能用了的. 样式也是,所以复制过去看不是我贴出来的界面 ...

  2. 如何用<dl>标签做表格而不用table标签

    我们都知道很多的内容编辑器(TinyMCE编辑器.fck)都有插入表格功能,快速方便,但是这些表格用到的<table>标签,可以查看html源代码就能发现,table标签对搜索引擎不是很友 ...

  3. 三星固态Dell版的960g的sm863a硬盘

    smart参数 CrystalDiskMark测试 AS SSD 测试 HD Tune Pro测试 DiskGenius查看 总结: 按我的测试,性能比sm865的还好,不知道咋回事,按三星给的参数这 ...

  4. VSS 使用方法

    VSS 的全称为 Visual Source Safe .作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目.管理软件开发中各 ...

  5. 洛谷 CF997A Convert to Ones

    洛谷 CF997A Convert to Ones 洛谷传送门 题意翻译 给你一个长度为 nn 的01串( n \leq 310^5n*≤3∗105 ),你有两种操作: 1.将一个子串翻转,花费 XX ...

  6. VIJOS-P1066 弱弱的战壕

    JDOJ 1247: VIJOS-P1066 弱弱的战壕 题目传送门 Description 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了--b. mx在他的基地附近建立了 ...

  7. 9.consul获取服务实例,调用测试

    package main import ( "context" "fmt" "github.com/go-kit/kit/endpoint" ...

  8. python总结五

    1.is和==的区别:官方文档解释:is表示的是对象标识符,而==表示的是相等equal,is的作用是用来检查对象的标识符是否一致,也就是两个对象在内存中的地址是否一样 而==是用来检查两个对象是否相 ...

  9. Linux下的串口编程(转)

    https://blog.csdn.net/tigerjibo/article/details/6179291 #include<stdio.h> /*标准输入输出定义*/ #includ ...

  10. 【Kubernetes学习之一】Kubernetes 简介

    环境 centos 7 一.概念和组件Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理,简称k8s. 1.Master Kubernetes中的 ...