Python类与实例变量赋值疑问:代码运行结果不符预期
问题原因分析
你的核心问题是误解了Python中实例变量赋值的逻辑,以及self.counter +=4这行代码的执行过程,同时对ClassCounter().counter的行为判断有误。
1. self.counter +=4的实际执行逻辑
Python中访问self.attr时,会遵循实例→类→父类的属性查找顺序:
- 当执行
self.counter +=4时,第一步是读取self.counter:此时新创建的实例还没有自己的counter变量,所以会去类中读取类变量counter的当前值。 - 第二步是计算
值+4,然后将结果赋值给实例的counter变量——这一步才会在实例上创建独立的counter实例变量。
具体执行步骤拆解
创建o1时:
- 类变量
counter初始为0 self.counter +=4:读取类变量的0,计算0+4=4,赋值给o1的实例变量counter(此时o1才有了自己的counter)type(self).counter +=100:类变量从0变为100- 所以打印结果符合你的预期:
Instance variable value : 4 , Class variable value : 100
创建o2时:
- 类变量
counter此时是100 self.counter +=4:读取类变量的100,计算100+4=104,赋值给o2的实例变量countertype(self).counter +=100:类变量从100变为200- 所以o2的实例变量是104,而非你预期的4——这就是结果不符的核心原因。
2. 最后两行输出的误解
你写的print("Class variable value : ", ClassCounter().counter)存在两个错误:
- 首先,
ClassCounter()会创建一个全新的匿名实例,触发__init__中的所有逻辑:类变量会从200增加到300,同时这个新实例的counter是200+4=204(还是遵循之前的赋值逻辑)。 - 其次,
.counter取的是这个新实例的实例变量值,不是类变量值。
所以这行代码的实际效果是:创建实例→类变量+100→打印实例的counter(204),之后你打印ClassCounter.counter得到的是300,而非你预期的400。
修正方案
如果要让每个实例的counter固定为4,直接在__init__中给实例变量赋值,而非基于类变量做增量运算:
class ClassCounter: counter = 0 def __init__(self): self.counter = 4 # 直接赋值,跳过类变量查找 type(self).counter += 100 o1 = ClassCounter() print("Instance variable value : ", o1.counter, ", Class variable value : ", ClassCounter.counter) o2 = ClassCounter() print("Instance variable value : ", o2.counter, ", Class variable value : ", ClassCounter.counter) # 如果要打印类变量,直接访问类属性,不要创建新实例 print("Class variable value : ", ClassCounter.counter) # 若要验证新实例的counter,可单独创建 temp_instance = ClassCounter() print("New instance counter : ", temp_instance.counter, ", Class variable value : ", ClassCounter.counter)
运行后输出将符合你的预期:
Instance variable value : 4 , Class variable value : 100 Instance variable value : 4 , Class variable value : 200 Class variable value : 200 New instance counter : 4 , Class variable value : 300
内容的提问来源于stack exchange,提问作者Giridhar
相关产品推荐
相关产品推荐

