python中的作用域有4种:

名称 介绍
L local,局部作用域,函数中定义的变量;
E enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
B globa,全局变量,就是模块级别定义的变量;
G built-in,系统固定模块里面的变量,比如int, bytearray等。

搜索变量的优先级顺序依次是(LEGB):

作用域局部 > 外层作用域 > 当前模块中的全局 > python内置作用域。

number = 10             # number 是全局变量,作用域在整个程序中
def test():
print(number)
a = 8 # a 是局部变量,作用域在 test 函数内
print(a) test() 运行结果:
10
8
def outer():
o_num = 1 # enclosing
i_num = 2 # enclosing
def inner():
i_num = 8 # local
print(i_num) # local 变量优先
print(o_num)
inner()
outer() 运行结果:
8
1
num = 1
def add():
num += 1
print(num)
add() 运行结果:
UnboundLocalError: local variable 'num' referenced before assignment

如果想在函数中修改全局变量,需要在函数内部在变量前加上 global 关键字

num = 1                    # global 变量
def add():
global num # 加上 global 关键字
num += 1
print(num)
add() 运行结果:
2

同理,如果希望在内层函数中修改外层的 enclosing 变量,需要加上 nonlocal 关键字

def outer():
num = 1 # enclosing 变量
def inner():
nonlocal num # 加上 nonlocal 关键字
num = 2
print(num)
inner()
print(num)
outer() 运行结果:
2
2

另外我们需要注意的是:

1.只有模块、类、及函数才能引入新作用域;

2.对于一个变量,内部作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部作用域的变量(这时只能查看,无法修改);

3.如果内部作用域要修改外部作用域变量的值时, 全局变量要使用 global 关键字,嵌套作用域变量要使用 nonlocal 关键字。

Python 函数的作用域的更多相关文章

  1. Python函数的作用域规则和闭包

    作用域规则 命名空间是从名称到对象的映射,Python中主要是通过字典实现的,主要有以下几个命名空间: 内置命名空间,包含一些内置函数和内置异常的名称,在Python解释器启动时创建,一直保存到解释器 ...

  2. python函数的作用域

    python函数的作用域 以下内容参考自runoob网站,以总结python函数知识点,巩固基础知识,特此鸣谢! 原文地址:http://www.runoob.com/python3/python3- ...

  3. python 函数的作用域,闭包函数的用法

    一.三元表达式 if条件成功的值    if  条件   else else条件成功的值 #if条件成立的结果 if 条件 else else条件成立的结果 # a = 20 # b = 10 # c ...

  4. python函数的作用域和引用范围

    以下内容参考自runoob网站,以总结python函数知识点,巩固基础知识,特此鸣谢! 原文地址:http://www.runoob.com/python3/python3-function.html ...

  5. Python函数学习——作用域与嵌套函数

    全局与局部变量 在函数中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的函数. 当全局变量与局部变量同名时,在定义局部变量的函数内 ...

  6. py-day3-3 python 函数的作用域

    def test1(): print('in the test1') def test(): print('in the test') return test1 print(test) res = t ...

  7. python学习三十七天函数的作用域查找顺序LEGB

    python函数的作用域查找顺序LEGB,分别为 locals  eclosing  globals  builtins .了解作用域的范围,可以更好的操作你想要的业务,分别介绍一下. 1,local ...

  8. Python函数作用域的查找顺序

    函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...

  9. python学习day10 函数Ⅱ(参数&作用域)

    函数Ⅱ(参数&作用域) 知识小结: py2与py3的区别 逻辑运算()>not>and>or 字符串翻转切片翻转 is与==区别 git相关 数据类型判断 操作系统:cent ...

随机推荐

  1. 6.装配Bean基于注解

    1.注解:就是一个类,使用@注解名称 开发中:使用注解 取代 xml配置文件. @Component取代<bean class=""> @Component(" ...

  2. Service启动过程分析

    Service是一种计算型组件,用于在后台执行一系列的计算任务.由于工作在后台,因此用户是无法直接感知到它的存在.Service组件和Activity组件略有不同,Activity组件只有一种运行模式 ...

  3. 【接口时序】7、VGA接口原理与Verilog实现

    一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1. FPGA型号:Xilinx公 ...

  4. 关于Linux MongoDB的安装

    前一篇博文讲解了如何安装与配置MongoDB的windows版,本篇博文接着上一篇讲解如何在Linux系统中安装与配置MongoDB,为了演示,我问同事要了它的云服务器用于演示,当然我自己也有,但是已 ...

  5. accept:Invalid Argument

    错误 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int accept(int sockfd, ...

  6. MySQL备份---lvm snapshot

    正常安装(缺点要锁表) 1, 创建一个LV(逻辑卷) , 把MySQL的数据目录放到这个LV上 /var/lib/mysql 对这个LV做快照, 从快照备份数据 删除快照 非正常安装 1,创建LV 2 ...

  7. 搭建docker环境准备

    Docker平台的基本构成

  8. 开源性能测试工具Locust使用篇(一)

    1. 环境准备 安装python3.6 ,安装步骤略 pip install locust 安装完成后使用locust -V检查 2.locust使用,先编辑一个简单的load_test.py的脚本 ...

  9. ajax无刷新技术

    第一步:创建ajax引擎 var xmlhttp=""; if(window.XMLHttpRequest){ xmlhttp=new XMLHttpRequest(); }els ...

  10. docker 中ulimit设置理解

    背景: 在k8s上跑es集群碰到的问题 OS版本 红旗4.5(基于centos6.8 内核) Docker:1.17.02 现象: 本次出现的问题现象:es pod启动失败,一直报max file d ...