变量作用域

一个程序的所有变量并不是在哪个位置都可以访问的。访问权限取决于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。

如下为两种最基本的变量的作用域:

  • 全局变量

  • 局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。

举例:

num = 0 #全局变量
def sum(arg1,arg2):#返回两个参数的和num = arg1 + arg2   #num在这里是局部变量print('局部变量:',num)return num
sum(10,5)
print('全局变量:',num)

执行结果:

局部变量: 15
全局变量: 0

python中的作用域分4种情况

  • L:local,局部作用域,即函数中定义的变量;
  • E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
  • G:globa,全局变量,就是模块级别定义的变量;
  • B:built-in,系统固定模块里面的变量,比如int, bytearray等。 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。
x = int(3.9)    #int built-inf ,系统固定模块里面的变量;
g_count = 10    #globa,全局变量;
def outer():e_count = 1 #enclosing,包含此函数的上级函数的局部作用域,但不是全局;def inner():l_count = 2 #local,局部作用域,函数中定义的变量;print(o_count)inner()
outer()

local和enclosing是相对的,enclosing变量相对上层来说也是local;

作用域产生

在Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如if、try、for等)是不会引入新的作用域的,如下代码,if并没有引入一个新的作用域,x仍处在当前作用域中,后面代码可以使用:

if 2>1:x = 1
print(x)    #结果为 1

def、class、lambda是可以引入新作用域的:

def test():x = 2
print(x) #NameError: name 'x' is not defined

global关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了,当修改的变量是在全局作用域(global作用域)上的,就要使用global先声明一下,代码如下:

count = 20
def outer():global countprint(count)count = 200print(count)
outer()

执行结果:

20
200

nonlocal关键字

global关键字声明的变量必须在全局作用域上,不能嵌套作用域上,当要修改嵌套作用域(enclosing作用域,外层非全局作用域)中的变量就需要nonlocal关键字了:

def outer():num = 20def inner():nonlocal numnum = 100print(num)inner()print(num)
outer()

执行结果:

100
100

总结:

(1)变量查找顺序:LEGB,作用域局部>外层作用域>当前模块中的全局>python内置作用域;

(2)只有模块、类、及函数才能引入新作用域;

(3)对于一个变量,内部作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部作用域的变量;

(4)内部作用域要修改外部作用域变量的值时,全局变量要使用global关键字,嵌套作用域变量要使用nonlocal关键字。nonlocal是python3新增的关键字,有了这个 关键字,就能完美的实现闭包了。

高阶函数

变量可以指向函数,函数的参数可以接收变量,那么函数可以接收另一个函数作为参数,这种函数称为高阶函数

1、函数名可以作为参数输入
2、函数名可以作为返回值 

把函数作为实参:

def fun(f):return f()
def hello():return "hello world"
print(fun(hello))
hello world

把函数作为返回值:

def foo():def hello():return "hello world"return hello
f = foo()
print(f())
hello world

系统内置高阶函数

1、map函数:接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并且把结果作为新的列表返回

def f(x):return x**2
ty = map(f,(1,2,3,4))
li = list(ty)
print(ty)
print(li)

执行结果

<map object at 0x0141EA70>
[1, 4, 9, 16]

2、reduce函数:把一个函数作用到一个序列上,这个函数必须接收两个参数,reduce把结果和序列的下一个元素做累积计算

from functools import reduce
def add(x, y):return x + y
print(reduce(add,range(1,5)))   # 累加1+2+3+4
print(reduce(add, range(1, 10)))  ## 4950 (注:1+2+...+9)
print(reduce(add, range(1, 10), 20))  ## 4970 (注:1+2+...+9+20)

执行结果:

10
45
65

3、filter函数:也接收一个函数和一个序列,和map函数不同的是,filter函数把传入的函数依次作用于每个元素,然后返回返回值是True的元素

例一:

str = ['a','b','c','d']
def fun(s):if s != 'a':return s
ret = filter(fun,str)
print(list(ret))
['b', 'c', 'd']

例二:

def str(k):if k % 2 == 0:return Trueelse:return False
ret = filter(str,range(1,11))
print(list(ret))

打印结果:

[2, 4, 6, 8, 10]

参考:https://www.cnblogs.com/yuanchenqi/articles/5828233.html

python作用域,变量作用域相关推荐

  1. python中变量作用域

    python中变量作用域采取以下规则: 1.python能够改变变量作用域的代码段是def.class.lamda. 2.if/elif/else.try/except/finally.for/whi ...

  2. Python中变量作用域问题

    我们经常听说Python函数访问局部变量.全局变量:在定义装饰器的时候,还会使用自由变量.这些不同的变量是如何赋值.初始化.查找及修改的呢?各自的作用细则又是什么样的呢?本篇尝试解答这个问题. Pyt ...

  3. python legb_Python变量作用域LEGB用法解析

    这篇文章主要介绍了Python变量作用域LEGB用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 闭包就是, 函数内部嵌套函数. 而 装饰器只 ...

  4. Python 的变量作用域和 LEGB 原则

    在 Python 程序中创建.改变或查找变量名时,都是在一个保存变量名的地方进行中,那个地方我们称之为命名空间.作用域这个术语也称之为命名空间. 具体地说,在代码中变量名被赋值(Python 中变量声 ...

  5. python函数变量的作用域_学不会的Python函数——变量作用域

    1. LEGB函数 Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的.我们先来看一段代码. 上述代码有两个变量a,当在test函数中输出变量a的值是,为什么 ...

  6. Python基础-变量作用域

    1.函数作用域介绍 函数作用域 Python中函数作用域分为4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局 ...

  7. Python之变量作用域

    文章目录 一 变量作用域 1. Local(局部变量) 2. Enclosed(嵌套) 3. Global(全局) 4. Built-in(内置) 二 变量使用规则 三 变量的修改 1. global ...

  8. python的变量作用域

    1. 不在函数体内的变量或者在 if __name__=='__main__'中的变量,都是全局变量,注意访问这些全局变量的速度是比较慢的,因为这些全局变量放在一个全局的表中,需要查找 2. 在函数体 ...

  9. mysql变量作用域,变量作用域 | 类型、变量和值 | JavaScript 权威指南

    变量作用域 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #2 724 views 0 likes 0 collects 变量的作用域指的是程序源码中定义这个变量的区域,全局变量具有全局作用 ...

  10. python sizeof_python 变量作用域 v.__sizeof__() python 深复制 一切皆对象 尽量减少内存消耗 赋值语句的原理...

    CPython implementation detail: This is the address of the object in memory. copy - Shallow and deep ...

最新文章

  1. 关于学习Python的一点学习总结(4->成员资格->list->列表操作)
  2. 祛除雀斑的健康方法 - 健康程序员,至尚生活!
  3. java检测tcp存活_keep-alive 和 TCP存活检测
  4. Percona XtraBackup 关于 MySQL备份还原的详细测试
  5. 3.3线性回归简洁实现(API的使用)
  6. matlab中的类标转换程序
  7. 升级Struts2.5后使用DMI动态方法调用遇到问题
  8. php图片案例,web开发N例-案例2:PHP绘制图片、绘制中文
  9. 【转】android内存溢出的解决方法
  10. python小爬虫,爬取文章(知乎专栏)片段
  11. powerbi中的合并
  12. 7 位 CEO 创业自述:你熬过人生中最黑暗时刻的经历,是你成为强者的必然选择...
  13. 用户画像之ID-Mapping
  14. OpenFOAM提取等值面并计算面积
  15. C#使用Thread.Sleep()导致程序无响应的解决办法
  16. 嵌入式开发培训靠谱吗,嵌入式开发培训怎么样?
  17. 30本从禁书到名著的阅读书单
  18. 2015年 网络工程师试卷答案及详解
  19. 最全Ansible学习总结
  20. tcp三次握手丢包后会发生什么

热门文章

  1. 中国铂合金行业发展趋势及投资风险研究报告
  2. 深度学习笔记------现阶段的目标检测器结构解析(Neck[FPN,PANet,Bi-FPN],Head[rpn,yolo...])
  3. windows server 2016使用RemoteApp
  4. redisTemplate阻塞式处理消息队列
  5. 网工知识角|什么是防火墙你知道吗?一篇直接搞懂
  6. 励志名言---001
  7. 网络基础--简单认识网络原理
  8. 【雷神源码解析】无基础看懂AAC码流解析,看不懂你打我
  9. Java代码实现两个数据库之间的数据同步
  10. 推荐几本中医养生保健的书