为何box、rect、wide_box指向同一实例?Python类引用疑问
问题解答
为什么box、rect、wide_box指向同一个实例?
在Python中,变量存储的不是对象本身,而是指向对象的引用:
- 执行
box = Rectangle(5,3)时,内存中生成一个Rectangle实例,box变量保存的是这个实例的引用。 - 调用
stretch(box)时,会把box的引用传递给函数的形式参数rect,此时rect和box指向同一个实例。 - 函数最后返回
rect(也就是该实例的引用),赋值给wide_box,所以wide_box也指向同一个实例。
这就是三者"等价"的核心原因——它们都指向内存中同一个Rectangle对象。
wide_box是不是让box的length值翻倍了?
是的,而且调用stretch(box)后,box本身指向的实例的length已经被修改了。可以加代码验证:
box = Rectangle(5,3) print(box.length) # 输出 5 wide_box = stretch(box) print(box.length) # 输出 10,原实例的length已被修改 print(wide_box.length) # 输出 10,和box指向同一个实例
因为stretch函数直接修改了传入实例的属性,而非创建新实例,所以原box指向的对象也跟着发生了变化。
rect作为形式参数,实际拥有什么值?
当stretch(box)被调用时,rect会被赋值为box的引用——也就是指向Rectangle(5,3)实例的内存地址。在函数执行期间,rect就是这个实例的引用,所以对rect.length的修改会直接作用在原实例上。函数执行结束后,rect这个局部变量会被销毁,但它指向的实例依然存在,被box和wide_box引用着。
内容的提问来源于stack exchange,提问作者noel
相关产品推荐
相关产品推荐

