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_them
  8.  
  9. Author: Crifan
  10. Verison: 2012-11-27
  11. -------------------------------------------------------------------------------
  12. """
  13.  
  14. #注:此处全局的变量名,写成name,只是为了演示而用
  15. #实际上,好的编程风格,应该写成gName之类的名字,以表示该变量是Global的变量
  16. name = "whole global name";
  17.  
  18. class Person:
  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. def sayYourName(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. def selfAndInitDemo():
  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变量了

Python中变量的作用域(variable scope)的更多相关文章

  1. Python中变量的作用域

    一.变量作用域的含义 变量的作用域说白了就是变量的值从哪里获取,或者说变量取值的地方 我们在写代码过程中会用到很多变量,这些变量会出现在各种代码块中,有的出现在函数块里,有的在函数块外,例如: def ...

  2. Python中命名空间与作用域使用总结

    1 引言 命名空间与作用域是程序设计中的基础概念,深入理解有助于理解变量的生命周期,减少代码中的莫名其妙bug.Python的命名空间与作用域与Java.C++等语言有很大差异,若不注意,就可能出现莫 ...

  3. 注意for循环中变量的作用域-乾颐堂

    1 2 for e in collections:     pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循 ...

  4. 注意for循环中变量的作用域

    for e in collections: pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循环之前已经有一个 ...

  5. C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

    全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...

  6. Python中变量、赋值、浅拷贝、深拷贝

    https://www.cnblogs.com/LetMe/p/6724555.html 在理解浅拷贝和深拷贝之前,首先要理解学习一下变量在Python中是怎样存储的: 变量的类型是分值引用与地址引用 ...

  7. Python中变量的本质探索

    Python中变量的本质探索 参考:Vamei博客Python进阶09 动态类型 ''' a = [1,2,3] ''' (1)这条"赋值语句"实际上是将a指向对象"[1 ...

  8. python中变量在内存中的存储与地址关系解析、浅度/深度copy、值传递、引用传递

    ---恢复内容开始--- 1.变量.地址 变量的实现方式有:引用语义.值语义 python语言中变量的实现方式就是引用语义,在变量里面保存的是值(对象)的引用(值所在处内存空间的地址).采用这种方式, ...

  9. python中变量的命令规制及变量的赋值方式

    文章结构:              一.python中变量的命名规则             二.变量赋值的三种方式             三.python的垃圾回收机制 一.Python中变量的 ...

随机推荐

  1. 关于Warn:name or service not known的解决办法

    由于之前搭建起了一个集群,然后直接将相应的配置文件复制过来 , 发现出现了 Warn:name or service not known 的问题,导致无法启动datanode. 解决的办法就是将sal ...

  2. 《JAVA学习笔记(14-1---14-7)》

    [14-1]面向对象-继承-概述 /* //描述学生 class Student { //属性 String name; int age; //行为 void study() { System.out ...

  3. numpy中的broadcast

    关于broadcast,官方文档描述如下: Each universal function takes array inputs and produces array outputs by perfo ...

  4. 极客DIY:如何构建一台属于自己的基站

    写在前面(原文作者) 上周我去特拉维夫(Tel Aviv)探望我的朋友结果有了一些收获,一块崭新的BladeRF(x40),即一个支持USB3.0的SDR平台,这就意味着可以同时发送和接收信息了.而H ...

  5. python 优雅的使用正则表达式 ~ 2

    使用正则表达式 那些基础的理论也说了不少了现在就开始 实操 ( 不知道为啥特别喜欢这个词... ) 吧 . 上一节课说过 正则表达式也是一门语言 , 他被集成到了python当中 , 并且用 re 模 ...

  6. python简介-copy

    首先python的老家https://www.python.org/ 原文http://www.runoob.com/python/python-intro.html Python 简介 Python ...

  7. DB other operation

    A prepared statement is a feature used to execute the same/similar SQL statement repeatedlly with hi ...

  8. ios openURL的使用(调用系统电话、浏览器、地图、邮件等)

    Safari Any URL starting with http:// which does not point to maps.google.com or www.youtube.com is s ...

  9. 为什么有的代码要用 base64 进行编码

    一.1.传输信道只支持ASCII字符,不方便传输二进制流的场合. 2.含有非ASCII字符,容易出现编码问题的场合. 3.简易的掩人耳目.至少非开发人一眼看不出来是啥. 二.Base64主要用于将不可 ...

  10. setInterval 函数传参(方法一)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...