Python修改全局变量X、Y为何对w2、w4类实例的属性无影响?
现象原因解释
- 首先明确Python的变量本质是指向内存中对象的标签,实例属性和全局变量是完全独立的两组标签,不存在自动绑定关系。
你初始化w2 = Wild(X, Y)、w4 = Wild(X, 18)时,只是把执行初始化代码的那一刻,全局变量X/Y指向的整数对象的引用,赋值给了实例的self.x、self.y属性。此时实例属性和全局变量只是刚好指向同一个整数对象,两者没有任何关联。
后续你修改全局变量X = w4.getX() + w3.getX() + w2.getX()、Y = ...,本质是把X、Y这两个全局标签,重新绑定到新计算得到的整数对象上,完全不会影响w2、w4等实例内部已经存储的self.x、self.y的指向,所以实例属性不会跟着全局变量更新。 - 其次Python中整数属于不可变类型,不存在修改已存在的整数对象值的可能,所有对整数变量的赋值操作本质都是更换变量指向的对象,这也从底层逻辑上决定了全局变量的修改不可能同步到已经初始化完成的实例属性上。
运行代码实际输出结果如下,和上述逻辑完全匹配:
31 7 44 8
和你预期的结果差异点:
print(X)输出31是全局变量计算后的值,但w4.getX()返回的还是w4初始化时存储的7- 全局变量Y计算后得到44,但
w2.getY()返回的还是w2初始化时存储的8
额外说明:你代码里的
Weird类的getX、getY方法没有加self前缀,直接返回x/y,调用时会读取全局作用域的X/Y值,所以如果调用w1.getX()会得到31,刚好符合你对w4.getX()的预期,但这是不符合规范的实例方法写法,正常的实例属性访问需要通过self前缀。
内容的提问来源于stack exchange,提问作者iamakhilverma
相关产品推荐
相关产品推荐

