Python中的数据类型分为值类型和引用类型,值类型通常包含int、float、bool、str、tuple,值类型是不可变的。引用类型包含list、set、dict类型,引用类型是可变的。在python的面向对象中,类不存在像其它语言中存在的static关键词,因此不能使用修饰实现类的静态变量。python面向对象中只有实例变量和类变量两变量概念,根本不存在静态变量的概念。本文地址:http://www.04007.cn/article/951.html,未经许可,不得转载.
接下来我们来看下面这个例子以及其运行结果,结果中有横线来区分开每个执行结果,比较好分别,如下:本文地址:http://www.04007.cn/article/951.html,未经许可,不得转载.
#定义四个方法,各操作一些属性 class task1: value=1 def increment(self): self.value += 1 class task2: value=[] def increment(self): self.value.append(1) class task3: def __init__(self): self.value=[] def increment(self): self.value.append(1) class task4: value=1 def increment(self): self.value += 1 #分别调用四个方法 if __name__=="__main__": a=task1() b=task1() a.increment() print(a.value) print(b.value) print('-'*30) a=task2() b=task2() a.increment() print(a.value) print(b.value) print('-'*30) a=task3() b=task3() a.increment() print(a.value) print(b.value) print('-'*30) print('-'*30) a=task4() b=task4() task4.value+=1 print(a.value) print(b.value) a.increment() print(a.value) print(b.value) print(task4.value) ===========运行结果================= 2 1 ------------------------------ [1] [1] ------------------------------ [1] [] ------------------------------ 2 2 3 2 2本文地址:http://www.04007.cn/article/951.html,未经许可,不得转载.
第1个示例应该如我们预期,只改变了a而b的没有变更。
第2个示例和第1个基本相同,但结果却是a和b都同时发生了改变。
第3个示例在2示例上做了一些改变,从而符合我们的预期。
第4个示例我们改变了task4的属性,其它的类的属性有的有影响,有的却没有影响。
是为什么呢?
第1个和第2个示例的相同点是都是类的属性,但一个是值类型,一个是引用类型。引用类型的类变量就如同我们其它语言的静态变量,尽管python没有静态变量的概念,但这样操作就实现了静态变量的功能。第3个示例和第2个的区别是第3个用的是实例的变量,所以各自归各自管理。第4个示例,实例化a和b的时候,他们都没有对属性value进行操作,所以打印出来的都是类task4的属性value,而在对象对自己的value进行操作之后,就与类的属性脱离关系,变成自己的属性。本文地址:http://www.04007.cn/article/951.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/951.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |