def a():
a = []
def aappend():
a.append(1)
aappend()
print a def b():
b = 1
def bchange():
b += 1 # 等于b = b + 1
bchange()
print b a()
b()

输出结果如下:

[1]

Traceback (most recent call last):
File "E:\Python-2.7.5\py\test.py", line 16, in <module>
b()
File "E:\Python-2.7.5\py\test.py", line 12, in b
bchange()
File "E:\Python-2.7.5\py\test.py", line 11, in bchange
b += 1
UnboundLocalError: local variable 'b' referenced before assignment

a函数输出正确,b函数报错说局部变量b在赋值前引用。

因为b函数中b被赋值(b += 1等价于b = b +1),b变成bchange中个一个局部变量,覆盖掉了b的外层作用域,所以找不到b的值。

而a函数中a是一个list,a.append()不属于对a赋值的操作,a的作用域依然在整个a函数中。

值得注意的是,python不会执行到赋值语句才会改变变量的作用域,如下例:

def c():
c = 1
def cchange():
b = c + 1
c = b
cchange()
print c c() Traceback (most recent call last):
File "E:\Python-2.7.5\py\test.py", line 28, in <module>
c()
File "E:\Python-2.7.5\py\test.py", line 23, in c
cchange()
File "E:\Python-2.7.5\py\test.py", line 21, in cchange
b = c + 1
UnboundLocalError: local variable 'c' referenced before assignment

如果是按照顺序执行到“b = c + 1”语句时,c仍然是外层变量,b应该得到值为2,结果却是找不到c的值,因为下一条语句"c = b"指定了c是局部变量。我们对代码稍作修改:

def c():
c = 1
def cchange():
b = c + 1
print b #去掉c = b
cchange()
print c c() #结果如下 2
1

结果b很自然地得到了值为2。

所以,只要一个代码块里有赋值语句,从一开始这个变量的作用域就变了,而且python不会去上层空间寻找变量名。

Python中作用域的特别之处的更多相关文章

  1. python中作用域

    Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的. 函数定义了本地作用域,而模块定义的是全局作用域.如果想要在函数内定义全局作用域,需要加上global修饰符. 变量名解析:LEG ...

  2. python中逻辑运算符“+”的特殊之处

    num = num + num 与 num += num 的区别(其他语言中这两种方式可以划等号,但是python中不可以): num = num + num: num = [100] def tes ...

  3. 详解Python的作用域和命名空间

    最近在学习Python,不得不说,Python真的是一门很好用的语言.但是学习的过程中关于变量作用域(scope)的命名空间(namespace)的问题真的把我给搞懵了.在查阅了相关资料之后,觉得自己 ...

  4. Python中的作用域及global用法

    Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的. 函数定义了本地作用域,而模块定义的是全局作用域. 如果想要在函数内定义全局作用域,需要加上global修饰符. 变量名解析:LE ...

  5. python中的作用域与名称空间

    python中的名称空间以及作用域分析 从Python解释器开始执行之后,就在内存中开辟一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征 ...

  6. 论python中的作用域

    编程语言从早至今,可以分为面向过程编程.面向函数编程和面向对象编程.BASIC语言是典型的面向过程编程的语言,C语言支持面向函数编程,但不支持面向对象,JAVA只支持面向对象编程,python同时支持 ...

  7. Python中的变量、引用、拷贝和作用域

    在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没 ...

  8. Python中变量的作用域(variable scope)

    http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...

  9. Python中的变量作用域

    python中变量作用域包括: L (Local) 局部作用域,函数内部声明但没有使用global的变量E (Enclosing) 闭包函数外的函数中,def或者lambda的本地作用域G (Glob ...

随机推荐

  1. HDU 3567 Eight II BFS预处理

    题意:就是八数码问题,给你开始的串和结束的串,问你从开始到结束的最短且最小的变换序列是什么 分析:我们可以预处理打表,这里的这个题可以和HDU1430魔板那个题采取一样的做法 预处理打表,因为八数码问 ...

  2. 理解public,protected 以及 private

    经常看到在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.我们首先要明白下面几点. 1.类的一个特征就是封装,public和private作用 ...

  3. codeforce 605BE. Freelancer's Dreams

    题意:给你n个工程,做了每个工程相应增长x经验和y钱.问你最少需要多少天到达制定目标.时间可以是浮点数. 思路:杜教思路,用对偶原理很简易.个人建议还是标准解题法,凸包+线性组合. #include& ...

  4. 【转载】shell中的特殊变量$

    shell中的特殊变量:变量名含义$0shell或shell脚本的名字$*以一对双引号给出参数列表$@将各个参数分别加双引号返回$#参数的个数$_代表上一个命令的最后一个参数$$代表所在命令的PID$ ...

  5. SQL2008-分页显示3种方法

    方法1: 适用于 SQL Server 2000/2005/2008 SELECT TOP 10 * FROM YieldRole WHERE id NOT IN ( SELECT TOP (10*( ...

  6. python 输出字符串如果遇到字典

    >>> d = {'a':1} >>> print '%s' % 1,d 1 {'a': 1} >>> print '%s %s' % 1,d T ...

  7. python 使用dict和set

    dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子,假设要根据同学的名字 ...

  8. elecworks中“插入点”的意思

    elecworks中自建符号时,”插入点“的用法: 插入点的作用是:建好的符号加入符号库后,从库里调用符号到原理图中时“插入点”就是符号的中心点---鼠标光标拖动的点. (插入点即为符号调出 时插入图 ...

  9. jquery-ui 之Sortable详解

    <div class="aaa"> <ul id="sortable"> <li id="test">I ...

  10. Linux--用SecureCRT来上传和下载文件

    SecureCRT下的文件传输协议有以下几种:ASCII.Xmodem.Ymodem.Zmodem ASCII:这是最快的传输协议,但只能传送文本文件. Xmodem:这种古老的传输协议速度较慢,但由 ...