Discuss / Python / 请教各位一个问题!

请教各位一个问题!

Topic source

Pmz丶

#1 Created at ... [Delete] [Delete and Lock User]

class Student(object): count = 0 def init(self, name): self.name = name self.count += 1

如果用self.count 而不用Student.count时: 类属性count不会因为实例的增加而增加。 永远都是最初定义的值:0。 由此得出 结论1:类属性不会因为实例自身的属性改变而改变? 但是, 如果这么写: class Student(object): count = [] #定义为一个空列表

def __init__(self, name):
    self.name = name
    self.count.append(1)  # 依旧使用self

#开始测试 bart = Student('Bart') print(Student.count)

bart1 = Student('Bart1') print(Student.count)

bart2 = Student('Bart2') print(Student.count)

输出结果: [1] [1, 1] [1, 1, 1] [Finished in 0.2s]

这里我尝试过,在初始化函数中无论用self.count,还是Student.count 打印结果相同。 这违背了结论1 百思不得其解,求大神解释一下,谢谢了!

貌似是append指向的问题, 改成self.count=self.count+[1]试试?

文章中有句话你要仔细看:

当我们定义了一个类属性后,这个属性虽然归类所有,但类的所有实例都可以访问到。

count = [] 创建了一个空 list,并用 count 指向它。 也就是 Student.countself.count 都指向了同一个对象。 所以 self.count.append(1)Student.count.append(1) 是完全一样的。

如果你对此有怀疑的话,可以写个程序验证下二者的 id 是否一致:

class Student(object):
    count = []

    def __init__(self, name):
        self.name = name
        self.count.append(1)


bart = Student('Bart')
bart1 = Student('Bart1')
bart2 = Student('Bart2')

print(id(Student.count))
print(id(bart.count))
print(id(bart1.count))
print(id(bart2.count))
# 全部是一样的值

补充:

实例属性若想把将类属性「纳为己有」,可以复制一份类属性,比如 self.count = list(Student.count)

更多关于复制的内容可以参考 Python 内置的 copy 模块,尤其是 copy.deepcopy 方法。

Pmz丶

#5 Created at ... [Delete] [Delete and Lock User]

首先谢谢你们的回复! 如果把count指向空list[] : print(id(Student.count)) print(id(bart.count)) print(id(bart1.count)) print(id(bart2.count)) 打印出来的ID 确实一致。(包括使用二楼兄弟所说的方法: 讲self.count.append(1)改成self.count=self.count+[1])

但是改成原来的 count = 0 ,函数中使用self.count += 1 , 我的打印结果是这样: 1457417664 #id(Student.count) 1457417696 #三个不同实例的ID 一致 1457417696 # 1457417696 # 那么汽水大佬的这段话: “count = [] 创建了一个空 list,并用 count 指向它。 也就是 Student.count 和 self.count 都指向了同一个对象。 所以 self.count.append(1) 和 Student.count.append(1) 是完全一样的。” 是否不能套用在count = 0 的情况上呢? Student.count 和 self.count 无法都指向 count 所指向的 int:0么? 感觉自己被绕进去了T T

@Pmz丶

我单独写了个回复:解释一个 Python 中的陷阱

如果还有疑问,可以在那个回复下问我,或者微博私信。

是否不能套用在 count = 0 的情况上呢?

不能套用,list 是可变类型,int 是不可变类型。


  • 1

Reply