Python中作用域的特别之处
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中作用域的特别之处的更多相关文章
- python中作用域
Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的. 函数定义了本地作用域,而模块定义的是全局作用域.如果想要在函数内定义全局作用域,需要加上global修饰符. 变量名解析:LEG ...
- python中逻辑运算符“+”的特殊之处
num = num + num 与 num += num 的区别(其他语言中这两种方式可以划等号,但是python中不可以): num = num + num: num = [100] def tes ...
- 详解Python的作用域和命名空间
最近在学习Python,不得不说,Python真的是一门很好用的语言.但是学习的过程中关于变量作用域(scope)的命名空间(namespace)的问题真的把我给搞懵了.在查阅了相关资料之后,觉得自己 ...
- Python中的作用域及global用法
Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的. 函数定义了本地作用域,而模块定义的是全局作用域. 如果想要在函数内定义全局作用域,需要加上global修饰符. 变量名解析:LE ...
- python中的作用域与名称空间
python中的名称空间以及作用域分析 从Python解释器开始执行之后,就在内存中开辟一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征 ...
- 论python中的作用域
编程语言从早至今,可以分为面向过程编程.面向函数编程和面向对象编程.BASIC语言是典型的面向过程编程的语言,C语言支持面向函数编程,但不支持面向对象,JAVA只支持面向对象编程,python同时支持 ...
- Python中的变量、引用、拷贝和作用域
在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没 ...
- Python中变量的作用域(variable scope)
http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...
- Python中的变量作用域
python中变量作用域包括: L (Local) 局部作用域,函数内部声明但没有使用global的变量E (Enclosing) 闭包函数外的函数中,def或者lambda的本地作用域G (Glob ...
随机推荐
- Puppet学习:pp文件权限问题
由于内网的Puppet还是在测试中,所以对文件权限等内容未做过多关注. 今天报了错误: Error: Could not retrieve catalog from remote server: Er ...
- POM详细配置
POM的全称是“ProjectObjectModel(项目对象模型)”. pom.xml详解 声明规范 <projectxmlns="http://maven.apache.org/P ...
- 【转载】IP首部、TCP首部、UDP首部
[转载自]http://blog.csdn.net/hjffly/article/details/7959889 IP首部 版本:L3协议版本号,IPv4或IPv6 首部长度:单位为4字节 协议:L4 ...
- [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)
A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不 ...
- C语言/C++中怎样产生随机数
C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,和time()函数. 需要说明的是,iostream头文件中就有srand函数的定义,不需要再额外引入stdlib. ...
- js不验证
给select添加了id,人家默认就有个id,id冲突导致js不验证
- C#- 将秒数转化成任意时间格式
将秒数转化成任意时间格式,可以使用C#的一个函数TimeSpan,看示例: TimeSpan ts = new TimeSpan(0, 0, 3661); richTextBox2.Text = ts ...
- win32进阶之路:给锁屏软件增加一个超链接按钮
前言: windows下一切皆窗口,我们看到的超链接也是窗口,效果图如下: 鼠标放在赵大哥博客园主页和关于软件两个按钮上,按钮上的字体会从绿色变成红色,同时鼠标指针变为手型,点下鼠标左键就会调用默认浏 ...
- PowerDesigner 面向对象模型(OOM)
PowerDesigner 面向对象模型(OOM)说明 nulljavasystemstringpowerbuilderclass 目录(?)[+] 一. OOM 简介 Object- ...
- spring源码解析(一)---占位符解析替换
一.结构类图 ①.PropertyResolver : Environment的顶层接口,主要提供属性检索和解析带占位符的文本.bean.xml配置中的所有占位符例如${}都由它解析 ②.Config ...