美文网首页初学者
Python的变量(全局变量、局部变量、类变量和实例变量)

Python的变量(全局变量、局部变量、类变量和实例变量)

作者: LiuShaodong | 来源:发表于2019-12-17 17:07 被阅读0次

    最近有很多小伙伴反应,有点搞不清 Python 的全局变量、局部变量、类变量和实例变量的区别以及用法,那我们今天详细介绍一下这4种变量的作用域和用法。

    全局变量

    听名字就可以知道该变量的作用范围是全局的,全局变量定义在模块(包)内,类和函数外,模块内的所有类和方法均可以访问全局变量。一般情况下,如果定义了全局变量不做变量的更新的话,没有问题。一旦要给全局变量重新赋值的时候,往往有的小伙伴会掉坑里,下面我们举个例子:

    BRAND = "BMW"
    
    
    def change_brand(new_brand):
        BRAND = new_brand
        print("new brand is: "+BRAND)
    
    
    def main():
        change_brand("宝马")
        print(BRAND)
    
    
    if __name__ == '__main__':
        main()
    

    以上代码中我们定义了一个全局变量 BRAND = "BMW",然后我们想通过 change_brand 函数对全局变量进行重新赋值,得到如下结果:

    发现结果并不符合预期,print(BRAND) 得到的结果还是 BMW 并没有给全局变量 BRAND 重新赋值为 宝马,这是因为我们在 change_brand 函数中如果不声明 global 关键字是索引不到全局变量,相当于在 change_brand 函数中又重新创建了一个与全局变量同名的变量,现将代码修改为:

    BRAND = "BMW"
    
    
    def change_brand(new_brand):
        global BRAND
        BRAND = new_brand
        print("new brand is: "+BRAND)
    
    
    def main():
        change_brand("宝马")
        print(BRAND)
    
    
    if __name__ == '__main__':
        main()
    

    局部变量

    在介绍全局变量的第一段代码 change_brand 函数中的 BRAND 就是局部变量,局部变量是定义在函数中的变量,其作用域也是在其所属函数内,在所属函数之外调用该局部变量会报错:

    def print_word():
        word = "car"
        print(word)
        
    
    def main():
        # change_brand("宝马")
        # print(BRAND)
        print(word)
    
    
    if __name__ == '__main__':
        main()
    

    这是因为 word 变量定义在 print_word 函数中,main 函数访问不到该变量,所以会报错,局部变量随着函数被调用而创建,随着函数执行结束而释放。

    类变量

    类变量也叫静态变量,类变量定义在类中,但不在类的函数中,可以不必创建该类的实例,直接通过类名调用类变量,也可以通过实例名访问类变量,这个可以根据情况灵活采用哪种调用方式:

    class Car(object):
        color = "blue"
    
    
    def main():
        # change_brand("宝马")
        # print(BRAND)
        # print(word)
        print(Car.color)
        car = Car()
        print(car.color)
    
    
    if __name__ == '__main__':
        main()
    

    类变量的作用范围为所属类中,并能被由所属类的所有实例对象所访问,什么意思呢?就是小伙伴们通过类 Car 创建出的所有的 Car 的实例对象都可以访问到类 Car 中的类变量 color

    实例变量

    对于整个模块(包),定义了全局变量,可以让模块中的所有类的函数共享;对于函数来说,如果不想将自己的私有变量共享,可以定义局部变量,那么除了函数本身外,“外界” 不会知道函数内部定义的变量;对于类,有了类变量,可以供类中和有血缘关系的类或者实例对象之间进行共享使用,也可以简单理解类变量为各个实例对象的 “共有属性值”,比如,校园的选课系统面向的全是学生,那么属性 title = student 可以声明成类变量,但是每个学生的学号,身高,体重等属性都是实例对象 Student 所特有的啊,那么该如何来描述这些特有属性呢?这就要靠实例变量了,这里我们引用上一篇介绍 Python 的类 class 的例子学习一下实例变量的用法:https://www.jianshu.com/p/c662dc5497cc

    class Student(object):
        tuition_fee = 12000
    
        def __init__(self, name, sex):
            print("这是类的初始化方法")
            self.name = name
            self.sex = sex
            print("类初始化完毕")
    
        def speak(self):
            print("student, name=", self.name, "; sex=", self.sex, "; tuition_fee=", self.tuition_fee)
    
    
    def main():
        student = Student("wangcai", "male")
        student.speak()
        student.name = "xiaoqaing"
        student.speak()
    
    
    if __name__ == '__main__':
        main()
    

    小伙伴们可以观察到,实例变量都是用 self 来修饰,表示类的实例对象,当然也可以把 self 换成别的标识,这是因为 self 并不是 Python 中的关键字。另外,实例变量只能通过实例对象访问,不能像类变量一样可以通过类名访问,这是因为实例变量存的都是一些实例对象特有的属性值。

    相关文章

      网友评论

        本文标题:Python的变量(全局变量、局部变量、类变量和实例变量)

        本文链接:https://www.haomeiwen.com/subject/cyusnctx.html