Python中变量的作用域(variable scope)
2016-01-25 10:22
736 查看
http://www.crifan.com/summary_python_variable_effective_scope/
解释python中变量的作用域
示例:
1、代码版
2、图解版
3、文字版
3.1 全局变量 (Global variable)
不论是其他普通函数中,还是Class类中,都可以通过对应的变量名直接引用。
3.2 局部变量(Automatic variable)
对于函数内,包括类Class的函数内,普通的 变量 都是自动临时变量
4、附:变量的优先级
普通局部变量和全局变量的作用域,最核心的区别在于:
内部变量的优先级大于外部变量
即(函数内的)局部变量优先级大于(外部的)全局变量
换句话说:
A、如果函数内部,出现了和全局变量同名的变量,则说明是局部变量;
B、如果函数内没有同名的局部变量,对应的变量则是全局变量
这个变量的优先级关系不仅针对python语言,几乎所有语言都适用,比如C/C++/C#等
所以,上面示例中的__init__中的name,不是全局变量:
name = “whole global name”;
中的name而是,局部变量;
其中,此处是属于那种,Python(和,或其他特殊)语言所特有的,无需声明变量,就可以直接使用的情况。
即局部变量name,并没有声明,但是就直接拿过来使用,通过:
name = newPersionName;
在初始化,设置为对应的名字,此处即”crifan”了。
5、类(Class)变量
类的变量,在类的范围内,只能通过
ClassName.PropertyName (或ClassName.VariableName)去访问当前类ClassNamer的变量PropertyName
例子中就是通过 Person.name 去访问类Person类中的变量name
6、示例(Instance)变量
示例中的变量理论上是用InstanceObject.PropertyName去访问的
而此处,由于Python中默认的约定俗成写法,把类中函数的第一个参数名定义为Instance变量,且名字叫self,所以就变成了:
self.PropertyName
上述类的函数中要想访问Instance变量就可通过 self.name去访问Person类示例中的name变量了
解释python中变量的作用域
示例:
1、代码版
#!/usr/bin/python # -*- coding: utf-8 -*- """ ------------------------------------------------------------------------------- Function: 【整理】Python中:self和init__的含义 + 为何要有self和__init__ http://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them Author: Crifan Verison: 2012-11-27 ------------------------------------------------------------------------------- """ #注:此处全局的变量名,写成name,只是为了演示而用 #实际上,好的编程风格,应该写成gName之类的名字,以表示该变量是Global的变量 name = "whole global name"; class Person: name = "class global name" def __init__(self, newPersionName): #self.name = newPersionName; #此处,没有使用self.name #而使得此处的name,实际上仍是局部变量name #虽然此处赋值了,但是后面没有被利用到,属于被浪费了的局部变量name name = newPersionName; def sayYourName(self): #此处,之所以没有像之前一样出现: #AttributeError: Person instance has no attribute 'name' #那是因为,虽然当前的实例self中,没有在__init__中初始化对应的name变量,实例self中没有对应的name变量 #但是由于实例所对应的类Person,有对应的name变量,所以也是可以正常执行代码的 #对应的,此处的self.name,实际上是Person.name print 'My name is %s'%(self.name); # -> class global name print 'name within class Person is actually the global name: %s'%(name); #-> whole global name print "only access Person's name via Person.name=%s"%(Person.name); # -> class global name def selfAndInitDemo(): persionInstance = Person("crifan"); persionInstance.sayYourName(); print "whole global name is %s"%(name); # -> whole global name ############################################################################### if __name__=="__main__": selfAndInitDemo();
2、图解版
3、文字版
3.1 全局变量 (Global variable)
不论是其他普通函数中,还是Class类中,都可以通过对应的变量名直接引用。
3.2 局部变量(Automatic variable)
对于函数内,包括类Class的函数内,普通的 变量 都是自动临时变量
4、附:变量的优先级
普通局部变量和全局变量的作用域,最核心的区别在于:
内部变量的优先级大于外部变量
即(函数内的)局部变量优先级大于(外部的)全局变量
换句话说:
A、如果函数内部,出现了和全局变量同名的变量,则说明是局部变量;
B、如果函数内没有同名的局部变量,对应的变量则是全局变量
这个变量的优先级关系不仅针对python语言,几乎所有语言都适用,比如C/C++/C#等
所以,上面示例中的__init__中的name,不是全局变量:
name = “whole global name”;
中的name而是,局部变量;
其中,此处是属于那种,Python(和,或其他特殊)语言所特有的,无需声明变量,就可以直接使用的情况。
即局部变量name,并没有声明,但是就直接拿过来使用,通过:
name = newPersionName;
在初始化,设置为对应的名字,此处即”crifan”了。
5、类(Class)变量
类的变量,在类的范围内,只能通过
ClassName.PropertyName (或ClassName.VariableName)去访问当前类ClassNamer的变量PropertyName
例子中就是通过 Person.name 去访问类Person类中的变量name
6、示例(Instance)变量
示例中的变量理论上是用InstanceObject.PropertyName去访问的
而此处,由于Python中默认的约定俗成写法,把类中函数的第一个参数名定义为Instance变量,且名字叫self,所以就变成了:
self.PropertyName
上述类的函数中要想访问Instance变量就可通过 self.name去访问Person类示例中的name变量了
相关文章推荐
- 基于Python Shell获取hostname和fqdn释疑
- python-dict
- 将Sublime Text 3设置为Python全栈开发环境
- 12306的变态验证码算得了什么?我有Python神器!
- Python 初学者的最佳学习资源
- Python爬虫实战(4):抓取淘宝MM照片
- python废话三:变量:局部变量和全局变量
- python --闭包学习
- 使SourceInsight支持Python语言的方法
- python废话二:学习python2还是python3
- 21行Python代码实现拼写检查器
- Python--(高阶)函数
- Python Unit Testing
- Python Unit Testing
- 44. Wildcard Matching leetcode Python 2016 new season
- 43. Multiply Strings leetcode python 2016 new season
- Python常用函数
- Python如何进行cross validation training
- Python/Keras如何将给定的数据集打乱
- Python-装饰器以及对带有参数的装饰器的理解