继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

python变量(全局变量,局部变量,类变量,实例变量)

慕士塔格
关注TA
已关注
手记 8
粉丝 20
获赞 124

一直对python的几个变量有点懵圈,这次好好总结一下,记录下来。

定义
  • 全局变量
    在模块内、在所有函数外面、在class外面,这就是全局变量
  • 局部变量
    在函数内、在class的方法内(未加self修饰),这就是局部变量
  • 静态变量
    在class内的,但不在class的方法内的,这就是静态变量
  • 实例变量
    在class的方法内的,用self修饰的变量,这就是实例变量
作用
全局变量

全局变量供全局共享,全局类和函数均可访问,达到同步作用。同时还可以被外部文件访问。

使用

全局变量使用的时候,需要用global显示声明。
一般情况下,如果函数直接调用全局变量,不做更新的话,一般没有问题,但如果有重新赋值,又没有在函数内部使用 global声明的话, 就相当于在内部创建了一个同名的局部变量,局部变量优先级要高于全局变量。

# coding:utf-8
_all = 'HelloWorld'    # 全局变量
_all_list = []    # 全局变量

def printall():
    global _all    # 这里需要用global显示声明
    print _all    # HelloWorld

错误:

# coding:utf-8
_all = 0    # 全局变量
_all_list = []    # 全局变量

def printall():
    # 这里不使用global显示声明
    # 更新一下_all,这里其实是printall的局部变量了
    _all = 3
    print _all

printall()     #  结果3
print _all    # 结果为0
局部变量

生命期间函数内

# coding:utf-8
def show():
    city = 'Beijing'    # 局部变量
    print city
静态变量

可以称为是类变量,通过类名可以直接访问,也可以通过实例名直接访问,此变量在类中全局共享,实例之间也是全局共享。可以看下面实例

# coding:utf-8
class foo:
    all = 0   
    def add(self):
        foo.q += 1

instance01 = foo()   # 实例化对象1
instance02= foo()    # 实例化对象2
print instance01.all    # 执行结果为:0
print instance02.all    # 执行结果为:0
print foo.all    # 执行结果为:0

instance01.add()
print instance01.all    # 执行结果为:1
print instance02.all    # 执行结果为:1
print foo.all    # 执行结果为:1

instance02.add()
print instance01.all    # 执行结果为:2
print instance02.all    # 执行结果为:2
print foo.all    # 执行结果为:2
实例变量

对于模块来说,有了自己的全局变量,可以供自己内部的类,函数使用,同步;对于函数或者类方法来说,有了自己的局部变量,供自己内部使用;对于类,有了静态变量,可以供内部和有继承关系的父子之际使用,同步;但实例之间各自的私有变量(局部变量)就要靠实例变量了,实现了动态绑定,多态特性。
用self来修饰

# coding:utf-8
class foo:
    all = 0
    def __init__(self, name):
        self.name = name
    def add(self):
        foo.q += 1

instance01 = foo('hello')
instance02 = foo('hi')
print instance01.name    # hello
print instance02.name    # hi
print foo.name     # AttributeError:class foo has no attribute 'name'
总结

在整个代码组织的过程中,一般会有这样两种基本需求,私有公有

私有

不与其他共享,自己独享,如函数和方法的局部变量,实例变量

公有

需要在一定范围内共享,达到同步目的,如模块内的代码共享的全局变量,类与子类之间共享的静态变量

打开App,阅读手记
9人推荐
发表评论
随时随地看视频慕课网APP

热门评论

没有foo.q吧,应该是fool.all

为什么 instance02.foo=2 了呢?

同上,foo.q是哪来的

查看全部评论