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. Python自动化开发 - RESTful API

    本节内容 1.  RESTful 简介 2.  RESTful 设计指南 3.  Django REST Framework 最佳实践 4.  理论拓展与开放平台 5.  API文档化与测试 一  R ...

  2. AddTransient,AddScope和AddSingleton 有什么不同?

    我们先来创建几个接口using System; namespace DependencyInjectionSample.Interfaces{ public interface IOperation ...

  3. Centos7.x gnome 桌面美化

    一.管理工具 gnome是通过gnome-tweak-tool(优化工具)来管理的,可以在左上角的应用程序->工具里找到. 也可以直接在终端输入gnome-tweak-tool来启动它.启动界面 ...

  4. 从github clone文件: Failed to receive SOCKS4 connect request ack.

    安装了代理,能上网,也能从github上下载文件,就是无法从github上clone文件, 查了很久资料后,终于发现使用sudo可以解决问题.不过,不知道原因是什么? 比如:git clone htt ...

  5. 08-部署node节点

    部署kubernetes node节点 kubernetes node 节点包含如下组件: Flanneld: 省略,参照之前部署的文档 Docker1.12.5: 省略,参照之前部署的文档 kube ...

  6. Oracle.ManagedDataAccess 提示ORA-01017 错误【解决方案】

    Oracle.ManagedDataAccess 提示ORA-01017 错误[解决方案] Oracle.ManagedDataAccess 提示ORA-01017 错误[解决方案] [HKEY_LO ...

  7. 《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf

    <ASP.NET Core跨平台开发从入门到实战>样章节 Web API自定义格式化protobuf. 样章 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于 ...

  8. java-Timer类使用方法

    Timer: public Timer()创建一个新计时器.相关的线程不 作为守护程序运行. 方法摘要: void schedule(TimerTask task, Date time)        ...

  9. IT人如何打造个性化的个人网站(在线简历)

    前言 众所周知,IT行业人员在求职时,如果拥有自己的技术博客和个人网站多少是可以加些分的,因为这也是IT人的技术证明之一.内容丰富的技术博客就不必多少了,往往技术博客大神市场上多是供不应求的,而且技术 ...

  10. solr单机部署tomcat

    所需软件:solr4.8.1.Tomcat7 下载完相应软件后开始单机部署(windows下) 在F盘根目录创建solr文件夹,并解压solr4.8和tomcat7到该文件夹 在F盘根目录创建solr ...