Python中变量的作用域(variable scope)
http://www.crifan.com/summary_python_variable_effective_scope/
解释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中变量的作用域(variable scope)的更多相关文章
- Python中变量的作用域
一.变量作用域的含义 变量的作用域说白了就是变量的值从哪里获取,或者说变量取值的地方 我们在写代码过程中会用到很多变量,这些变量会出现在各种代码块中,有的出现在函数块里,有的在函数块外,例如: def ...
- Python中命名空间与作用域使用总结
1 引言 命名空间与作用域是程序设计中的基础概念,深入理解有助于理解变量的生命周期,减少代码中的莫名其妙bug.Python的命名空间与作用域与Java.C++等语言有很大差异,若不注意,就可能出现莫 ...
- 注意for循环中变量的作用域-乾颐堂
1 2 for e in collections: pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循 ...
- 注意for循环中变量的作用域
for e in collections: pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循环之前已经有一个 ...
- C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期
全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...
- Python中变量、赋值、浅拷贝、深拷贝
https://www.cnblogs.com/LetMe/p/6724555.html 在理解浅拷贝和深拷贝之前,首先要理解学习一下变量在Python中是怎样存储的: 变量的类型是分值引用与地址引用 ...
- Python中变量的本质探索
Python中变量的本质探索 参考:Vamei博客Python进阶09 动态类型 ''' a = [1,2,3] ''' (1)这条"赋值语句"实际上是将a指向对象"[1 ...
- python中变量在内存中的存储与地址关系解析、浅度/深度copy、值传递、引用传递
---恢复内容开始--- 1.变量.地址 变量的实现方式有:引用语义.值语义 python语言中变量的实现方式就是引用语义,在变量里面保存的是值(对象)的引用(值所在处内存空间的地址).采用这种方式, ...
- python中变量的命令规制及变量的赋值方式
文章结构: 一.python中变量的命名规则 二.变量赋值的三种方式 三.python的垃圾回收机制 一.Python中变量的 ...
随机推荐
- DataNode,NameNode,JobTracker,TaskTracker用jps查看无法启动解决办法
查看tasktracker的50060的地址无法正常查看,主要有两个原因,一个是在/tmp目录下有以前使用2.02版本留下的文件没有删除,二个是因为端口被占用了 解决方法: 一.删除/tmp目录下所有 ...
- Unity开发Android应用程序:调用安卓应用程序功能
开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...
- 加载不同的nib文件
只需要实现nibName方法即可 另外还需在vc控制器初始化的时候不指定对应的nib文件名 -(NSString *)nibName { if(UI_USER_INTERFACE_IDIOM() == ...
- jstl表达式替换某些字符
转自:http://www.yiibai.com/jsp/jstl_function_replace.html fn:replace() 函数替换一个字符串与另一个字符串的所有匹配. 语法 fn:re ...
- Oracle的DDL、DML、DCL
DDL (Data Definition Language 数据定义语言) create table 创建表 alter table 修改表 drop table 删除表 truncate table ...
- fix eclipse gc overhead limit exceeded in mac
fix eclipse gc overhead limit exceeded: 在mac上找不到eclipse.ini文件编辑内存限制,在eclipse安装目录右击eclipse程序,选“显示包内容” ...
- 让Tomcat支持中文文件名
--参考链接:http://blog.chinaunix.net/uid-26284395-id-3044132.html 解决问题的核心在于修改Tomcat的配置,在Server.xml文件中添加一 ...
- 数据结构《14》----并查集 Union-Find
描述: 并查集是一种描述解决等价关系.能够方便地描述不相交的多个集合. 支持如下操作 1. 建立包含元素 x 的集合 MakeSet(x) 2. 查找给定元素所在的集合 Find(x), 返回 ...
- Intent的简介以及属性详解
一.Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述 ...
- HDU 3966 (树链剖分+线段树)
Problem Aragorn's Story (HDU 3966) 题目大意 给定一颗树,有点权. 要求支持两种操作,将一条路径上的所有点权值增加或减少ai,询问某点的权值. 解题分析 树链剖分模板 ...