本代码先后通过实例和类对类变量进行赋值并追踪变量的地址进行探查
废话不多说,先铺代码再研究
class Person:
name = '无常'
def __init__(self,name):
print(f"创建实例{name}成功")
p = Person('p')
print('Person.name=', Person.name)
print('p.name=', p.name)
print('Person.name地址=', id(Person.name))
print('p.name地址=', id(p.name))
print('修改Person.name为liuxugui666')
Person.name = 'liuxugui666'
print('Person.name=', Person.name)
print('p.name=', p.name)
print('Person.name地址', id(Person.name))
print('p.name地址', id(p.name))
print('修改p.name为无常先生后')
p.name = '无常先生'
print('Person.name=', Person.name)
print('p.name=', p.name)
print('p.name地址', id(p.name))
print('Person.name地址', id(Person.name))
print('修改Person.name为WuChang后')
Person.name = 'WuChang'
print('Person.name=', Person.name)
print('p.name=', p.name)
print('Person.name地址', id(Person.name))
print('p.name地址', id(p.name))
p1 = Person('p1')
print('p1.name的地址',id(p1.name))
运行结果如下
1.创建实例p后通过p直接调用类变量name,此时Person.name 和 p.name值和地址均相同 显然p.name直接指向类变量的内存空间
p = Person('p')
print('Person.name=', Person.name)
print('p.name=', p.name)
print('Person.name地址=', id(Person.name))
print('p.name地址=', id(p.name))
2.随后,通过Person修改name的值,可以看出Person.name的地址发生了改变,但同时p.name也发生了改变 并指向了Person.name的同一个地址
print('修改Person.name为liuxugui666')
Person.name = 'liuxugui666'
print('Person.name=', Person.name)
print('p.name=', p.name)
print('Person.name地址', id(Person.name))
print('p.name地址', id(p.name))
3.通过实例p修改类变量name的值,显然p.name的地址发生了改变。但是Person.name的地址没有变化。此时p.name与Person.name指向了不同的地址空间
p.name = '无常先生'
print('Person.name=', Person.name)
print('p.name=', p.name)
print('p.name地址', id(p.name))
print('Person.name地址', id(Person.name))
4.再次通过类Person修改类变量name的值,显然Person.name的地址发生了改变,可奇怪的是p.name居然没有随之改变。也就是说p.name指向了一块独立的与Person无关联的地址空间
print('修改Person.name为WuChang后')
Person.name = 'WuChang'
print('Person.name=', Person.name)
print('p.name=', p.name)
print('Person.name地址', id(Person.name))
print('p.name地址', id(p.name))
5.再次创建一个实例p1,并输出p1.name的地址,此时 p1.name任然指向了Person.name的同一个地址
p1 = Person('p1')
print('p1.name的地址',id(p1.name))
总结:由上分析,那么是不是可以认为。当实例p对类变量name进行修改后,对于p来说类变量name已经变成了一个类似实例变量,只属于实例p的私有变量了呢?而对于p1来说类变量还是一个属于类的公有变量
PS:刚学Python,以上属于尝试解决自己的困惑,如果犯了低级错误请指正。谢谢(_)