python中变量的作用域有几种_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中变量的作用域

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

随机推荐

ubuntu下安装mcrypt

sudo apt-get install libmcrypt4 php5-mcrypt 一句命令搞定

Azure ARM (3) ARM支持的服务类型

我们在使用ARM创建资源的时候,首先要确认哪些Azure服务,支持ARM模式. 具体内容,我们可以参考连接:https:// ...

[2015hdu多校联赛补题]hdu5348 MZL's endless loop

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348 题意:给你一个无向图,要你将无向图的边变成有向边,使得得到的图,出度和入度差的绝对值小于等于1, ...

图片缓存之内存缓存技术LruCache,软引用

每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常, 这个问题曾经让我觉得很烦恼,后来终于得到了解决, 那么现在就让我和大家一起分享一下吧. 这篇博文要讲的图片缓存机制,我接触到的有两 ...

Android bitmap图片处理

一.View转换为Bitmap         在Android中所有的控件都是View的直接子类或者间接子类,通过它们可以组成丰富的UI界面.在窗口显示的时候Android会把这些控件都加载到内存中 ...

201621123050 《Java程序设计》第10周学习总结

1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...

python 练习1(流控制)

#!/usr/bin/python #_*_ coding:utf-8 _*_ #练习题 #1.使用while循环输入 1 2 3 4 5 6 8 9 10 #a.定义一个变量存放数字 #b.用whi ...

C++虚析构函数的作用

注:本文内容来源于zhice163博文,感谢作者的整理. 1.为什么基类的析构函数是虚函数? 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生. 下面转自网络:源地址  ...

【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

------------------------------------------------------------------------------------ 17/24 --------- ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值