文档章节

零基础学python-16.3 变量名解析:LEGB原则

raylee2015
 raylee2015
发布于 2015/09/17 16:41
字数 625
阅读 2
收藏 0

这一章节我们来说说变量名解析的原则:LEGB原则

1.当函数使用未认证的变量名时,python搜索4个作用域,本地作用域(L)->上一层结构中def或者lambda的本地作用域(E)->全局作用域(G)>内置作用域(B),并且在第一次找到这个变量名的地方停下来


2.函数给一个变量赋值的时候,总是创建或者改变本地作用域的变量名,除法他是声明为全局

>>> def test():
	x=1
	print(x)
	print(id(x))
	x=2
	print(x)
	print(id(x))

	
>>> test()
1
505991632
2
505991648
>>>

在test,我们第一次赋值给x的时候创建了变量,然后后面又改变了变量x,如果x是全局变量时,就会如下:

x='e f t efdad'
def test():
       print(x)
       print(id(x))
       #x=123
       #print(x)
       #print(id(x))
if __name__=='__main__':
        test()

但是,我们需要注意一点,看见上面代码里面的注释没有,如果注释放开了,他就会报错了,为什么?

x='e f t efdad'
def test():
       print(x)
       print(id(x))
       x=123
       print(x)
       print(id(x))
if __name__=='__main__':
        test()

输出:

>>> ================================ RESTART ================================
>>> 
Traceback (most recent call last):
  File "C:\Python34\test.py", line 9, in <module>
    test()
  File "C:\Python34\test.py", line 3, in test
    print(x)
UnboundLocalError: local variable 'x' referenced before assignment
>>>

没有找到本地变量x,我认为是这样的,虽然py是解释性的语言,但是他还是需要编译成pyc文件来执行,只不过这个过程我们看不见,在编译的过程中x其实已经被认定为本地变量,而不再是模块里面的全局变量,所以才会出现这种情况,那么怎么解决?我们只需要在改动x前面加上global x即可,global关键字我们下面的章节会详细讲述

x='e f t efdad'
def test():
       print(x)
       print(id(x))
       global x
       x=123
       print(x)
       print(id(x))
if __name__=='__main__':
        test()

输出:

>>> ================================ RESTART ================================
>>> 
e f t efdad
31843176
123
505993584
>>>

上面的代码保存为test.py然后运行即可

3.在函数之外给一个变量赋值(在模块顶层或者idle),本地作用域和模块的命名空间是相同的


总结:这一章节主要简单说明了变量名解析的LEGB原则

这一章节就说到这里,谢谢大家

------------------------------------------------------------------

点击跳转零基础学python-目录


版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/raylee2007/article/details/48412487

raylee2015
粉丝 6
博文 265
码字总数 44224
作品 0
江门
私信 提问
Python变量查找LEGB原则

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_35085676/article/details/79851251 两种类型 首先要知道Python的基本数据类型分为2种,可变以及不可变...

岚漾忆雨
2018/04/08
0
0
python——作用域之LEGB规则

1 变量的作用域   Python是静态作用域,也就是说在Python中,变量的作用域源于它在代码中的位置;在不同的位置,可能有不同的命名空间。命名空间是变量作用域的体现形式。 2 LEGB各自代表的...

翠竹09
2018/08/12
0
0
【函数】02、函数进阶

一、函数的返回值 In [4]: def add(x, y): ...: return x+y ...: In [5]: add(1, 2)Out[5]: 3 In [8]: def add(x, y): ...: return x+y ...: print(x+y) ...: In [9]: add(1, 2)Out[9]: 3 In......

xiexiaojun
2017/06/10
0
0
Python第四课----函数

函数 一、函数 由若干语句组成的语句块,函数名称、参数列表构成,它是组织代码的最小单元。 二、函数的作用 1、对代码的最基本封装,按照功能组织一段代码。2、目的为了复用,减少冗余代码。...

菜鸡满地跑
2018/06/26
0
0
python 第3章 之三 闭包,模块等

闭包&LEGB法则 所谓闭包,就是将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象 听上去的确有些复杂,还是用一个栗子来帮助理解一下。假设我们在foo.py模块中做了如下定义: ...

huangsheng2
2018/05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

可见性有序性,Happens-before来搞定

写在前面 上一篇文章并发 Bug 之源有三,请睁大眼睛看清它们 谈到了可见性/原子性/有序性三个问题,这些问题通常违背我们的直觉和思考模式,也就导致了很多并发 Bug 为了解决 CPU,内存,IO ...

tan日拱一兵
14分钟前
2
0
网络七层模型与TCP/UDP

为了使全球范围内不同的计算机厂家能够相互之间能够比较协调的进行通信,这个时候就有必要建立一种全球范围内的通用协议,以规范各个厂家之间的通信接口,这就是网络七层模型的由来。本文首先...

爱宝贝丶
17分钟前
2
0
Jenkins World 贡献者峰会及专家答疑展位

本文首发于:Jenkins 中文社区 原文链接 作者:Marky Jackson 译者:shunw Jenkins World 贡献者峰会及专家答疑展位 本文为 Jenkins World 贡献者峰会活动期间的记录 Jenkins 15周岁啦!Jen...

Jenkins中文社区
35分钟前
8
0
杂谈:面向微服务的体系结构评审中需要问的三个问题

面向微服务的体系结构如今风靡全球。这是因为更快的部署节奏和更低的成本是面向微服务的体系结构的基本承诺。 然而,对于大多数试水的公司来说,开发活动更多的是将现有的单块应用程序转换为...

liululee
50分钟前
7
0
OSChina 周二乱弹 —— 我等饭呢,你是不是来错食堂了?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 自行车丢了:给主编推荐首歌 《クリスマスの夜》- 岡村孝子 手机党少年们想听歌,请使劲儿戳(这里) @烽火燎原 :国庆快来,我需要长假! ...

小小编辑
今天
534
9

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部