不可变对象和可变对象,类变量和实例变量

Posted by tzwlwy's Blog on July 17, 2018

在复习基础知识时,书上的一个例子我有点迷惑,代码如下

class Foo(object):
    x = 1.5

class Foo1(object):
   x = {2003: 'poe2'}

a=Foo()
# a.x = 1.7
a.x = Foo.x + 0.2
print(a.x)   #1.7
print(Foo.x) #1.5

foo = Foo1()
foo.x[2004] = 'valid path'
print(foo.x)  #{2003: 'poe2', 2004: 'valid path'}
print(Foo1.x) #{2003: 'poe2', 2004: 'valid path'}

对此我很奇怪,为什么Foo1.x 是 {2003: ‘poe2’, 2004: ‘valid path’} 而不是{2003: ‘poe2’}

后来去找刘总沟通,也在网上找到了答案

原文地址:类变量和实例变量的概念

原文地址:不可变对象和可变对象的概念

类变量和实例变量的概念

class Person():
    person = 'alive' #这是类变量
    def __init__(self,name ,age):
        self.name = name #这是实例变量
        self.age = age   #这是实例变量
        self.gender = '男' #这是实例变量
        #a = 456     #不能写这里,会出错
    place = ['地球','中国'] #这是类变量

上面这个简单的讲述了什么是实例变量什么是类变量,这个其实是比较好理解的

在实例化时,如果直接改变类变量会影响实例变量,实例变量不会影响到类变量

下文可以看到区别

if __name__=="__main__":
    p = Person('chb' , 18)
    p.person = 'die'
    print(p.person)#输出结果:die
    print(p.__dict__)#输出结果:{'gender': '男', 'person': 'die', 'age': 18, 'name': 'chb'}
    print(Person.person)  #输出结果:alive
    p.place[1] = '北京'
    print(p.place)#输出结果:['北京' , '北京']
    print(Person.place)#输出结果:['北京' , '北京']

不可变对象和可变对象的概念

这个之前理解过,大体可以理解为引用地址是否改变

在Python中,数字、字符串、元组是不可变的,,列表、字典、集合是可变的。