http://www.crifan.com/summary_python_variable_effective_scope/
解释python中变量的作用域
示例:
1、代码版
1 #!/usr/bin/python
2 #-*- coding: utf-8 -*-
3 """
4 -------------------------------------------------------------------------------5 Function:6 【整理】Python中:self和init__的含义 + 为何要有self和__init__7 http://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them8
9 Author: Crifan10 Verison: 2012-11-2711 -------------------------------------------------------------------------------12 """
13
14 #注:此处全局的变量名,写成name,只是为了演示而用
15 #实际上,好的编程风格,应该写成gName之类的名字,以表示该变量是Global的变量
16 name = "whole global name";17
18 classPerson:19 name = "class global name"
20
21 def __init__(self, newPersionName):22 #self.name = newPersionName;
23
24 #此处,没有使用self.name
25 #而使得此处的name,实际上仍是局部变量name
26 #虽然此处赋值了,但是后面没有被利用到,属于被浪费了的局部变量name
27 name =newPersionName;28
29 defsayYourName(self):30 #此处,之所以没有像之前一样出现:
31 #AttributeError: Person instance has no attribute 'name'
32 #那是因为,虽然当前的实例self中,没有在__init__中初始化对应的name变量,实例self中没有对应的name变量
33 #但是由于实例所对应的类Person,有对应的name变量,所以也是可以正常执行代码的
34 #对应的,此处的self.name,实际上是Person.name
35 print 'My name is %s'%(self.name); #-> class global name
36 print 'name within class Person is actually the global name: %s'%(name); #-> whole global name
37 print "only access Person's name via Person.name=%s"%(Person.name); #-> class global name
38
39 defselfAndInitDemo():40 persionInstance = Person("crifan");41 persionInstance.sayYourName();42 print "whole global name is %s"%(name); #-> whole global name
43
44 ###############################################################################
45 if __name__=="__main__":46 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变量了