文档章节

Python 变量作用域

sckgeneral
 sckgeneral
发布于 2016/10/05 14:42
字数 943
阅读 195
收藏 0
点赞 0
评论 0

1、作用域介绍 


python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量;
E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
G:globa,全局变量,就是模块级别定义的变量; B:built-in,系统固定模块里面的变量,比如int, bytearray等。 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。

1

2

3

4

5

6

7

x = int(2.9)  # int built-in

 

g_count = 0  # global

def outer():

    o_count = 1  # enclosing

    def inner():

        i_count = 2  # local

当然,local和enclosing是相对的,enclosing变量相对上层来说也是local。 


2、作用域产生


Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如if、try、for等)是不会引入新的作用域的,如下代码:

1

2

3

4

if True:

    x = 1;

print(x)

# 1

这个是没有问题的,if并没有引入一个新的作用域,x仍处在当前作用域中,后面代码可以使用。

1

2

3

4

def test():

    x2 = 2

print(x2)

# NameError: name 'x2' is not defined

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


3、变量的修改 


一个不在局部作用域里的变量默认是只读的,如果试图为其绑定一个新的值,python认为是在当前的局部作用域里创建一个新的变量,也就是说在当前局部作用域中,如果直接使用外部作用域的变量,那么这个变量是只读的,不能修改,如:

1

2

3

4

5

6

7

count = 10

def outer():

    print(count) 

    count = 100

    print(count)

outer()

#UnboundLocalError: local variable 'count' referenced before assignment


这里第一个print中,使用到了外部作用域的count,这样后面count就指外部作用域中的count了,再修改就会报错。 如果没使用过这个变量,而直接赋值,会认为是新定义的变量,此时会覆盖外部作用域中变量,如:

1

2

3

4

5

6

count = 10

def outer():

    count = 100  

    print(count)

outer()

#100

内部作用域中直接声明了count=100,后面使用count都是内部作用域的了。 


4、global关键字 


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

1

2

3

4

5

6

7

8

9

count = 10

def outer():

    global count

    print(count) 

    count = 100

    print(count)

outer()

#10

#100


5、nonlocal关键字 


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

1

2

3

4

5

6

7

8

9

10

11

def outer():

    count = 10

    def inner():

        nonlocal count

        count = 20

        print(count)

    inner()

    print(count)

outer()

#20

#20



6、小结 


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

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

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

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

© 著作权归作者所有

共有 人打赏支持
sckgeneral
粉丝 1
博文 19
码字总数 21562
作品 0
丰台
初识 Python:全局、局部和非局部变量(带示例)

本文导航 -全局变量01% -局部变量24% -全局变量和局部变量42% -非局部变量74% 全局变量 在 Python 中,在函数之外或在全局范围内声明的变量被称为全局变量。 这意味着,全局变量可以在函数内...

作者: Programiz ⋅ 05/12 ⋅ 0

听说这是70%学Python人,都会弄错的题,看你是否学到位

菜鸟独白 Python语言虽然优美,简洁和强大,但是也有很多坑,一不小心就会掉进去。我学Python的时候也遇到过,今天总结一下,希望对大家能有收获! 1.陷阱1:可变默认参数 Python里面可变参数...

雁横 ⋅ 05/05 ⋅ 0

Python面向对象编程之我见

面向对象基本概念 面向对象是一种编程范式。范式是指一组方法论。编程范式是一组如何组织代码的方法论。编程范式指的是软件工程中的一种方法学。 一些主流的编程范式: OOP - 面向对象编程 ...

bigstone2012 ⋅ 05/31 ⋅ 0

python笔记--作用域、高阶函数、闭包

作用域 python中被赋值的变量的位置不同,限制了能访问到变量的范围也不同,换句话说就是“变量的作用域是由其在代码中的位置所决定的”。 1.LEGB规则 L(local):局部作用域,拿两层嵌套函数来...

FJCA ⋅ 04/18 ⋅ 0

程序员必备,快速学习 Python 的全套14张思维导图(附高清版下载)

后台回复关键词 思维导图 可获取本文中的高清思维导图(PDF版) ML & AI∣一个有用的公众号 长按,识别二维码,加关注 获取更多精彩文章

micf435p6d221ssdld2 ⋅ 05/23 ⋅ 0

python3基础知识讲解(二)

引言 生活中有太多的不容易了,既然来到了这个世界,那么就请在坚持一下,就那么一下,你会挺过去的;没有人事一番风顺的,只有经得起磨练的人才会成功的,所以,坚持,在坚持!记住一句话:...

长风留言 ⋅ 05/30 ⋅ 0

Python中的变量作用域与命名空间(LEGB)

Python 使⽤LEGB的顺序来查找⼀个符号对应的对象 locals -> enclosing function -> globals -> builtins 局部变量———闭包空间———全局变量———内建模块 a = 1 # 全局变量 globals de...

qq_39521554 ⋅ 04/16 ⋅ 0

Python学习:作用域(namespace)

Python作用域基础 Python有四个作用域: L(Local)本地也称作局部作用域; E(Enclosing)闭包函数外的函数中; G(global)全局作用域; B(Built-in)内建作用域; 变量可以在三个不同的地...

VincentGu ⋅ 2017/05/09 ⋅ 0

Python 内置函数 dir()

简述 在 Python 中,有大量的内置模块,模块中的定义(例如:变量、函数、类)众多,不可能全部都记住,这时 函数就非常有用了。 是一个内置函数,用于列出对象的所有属性及方法。在 Python...

潘志闻 ⋅ 2017/07/14 ⋅ 0

Python能让你上天?(附代码)

Python当然能让你上天! 没试过?别担心,我来教你。和Python里的其他东西一样,它非常简单。你只需要敲入下面这行反重力代码 这是啥? 这是个彩蛋。import antigravity将打开一个指向经典X...

技术小能手 ⋅ 04/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 45分钟前 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 7

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部