Python函数传参疑问:为何修改类对象引用后原对象属性未变?
Python可变对象传参的困惑
我最近在学习Python入门知识,遇到一个困惑点:我知道传入字符串、整数这类不可变对象(immutable objects)到函数后,原对象不会被修改;但书中提到,像类对象这类可变对象(mutable objects),若在函数内修改其内容,原对象的值会改变。
但我对书中示例和checkpoint练习题的结果感到困惑:
书中示例
class Circle: def __init__(self, radius = 1): self.radius = radius def getPerimeter(self): return 2 * self.radius * 3.14 def getArea(self): return self.radius * self.radius * 3.14 def setRadius(self, radius): self.radius = radius def main(): myCircle = Circle() n = 5 printAreas(myCircle, n) print("\nRadius is", myCircle.radius) print("n is", n) def printAreas(c, times): print("Radius \t\t Area") while times >= 1: print(c.radius, "\t\t", c.getArea()) c.radius +=1 times -=1 main()
Checkpoint练习题
class Count: def __init__(self, count = 0): self.count = count def main(): c = Count() n = 1 m(c,n) print("count is", c.count) print("n is", n) def m(c,n): c = Count(5) n = 3 main()
我想知道为什么练习题中c.count的值仍是0而非5?
解答
书中示例的逻辑:
在printAreas函数里,c.radius +=1是直接修改传入的Circle对象内部的属性值——函数参数c指向的是和main里myCircle完全相同的对象,修改这个对象的属性自然会同步影响外部的原对象。练习题的逻辑:
在m函数里,c = Count(5)不是修改原Count对象的内容,而是重新给函数内部的局部变量c绑定了一个全新的Count对象。此时函数内的c和main函数里的c已经指向两个完全不同的对象,原对象没有被做任何修改,所以main里打印的c.count还是初始的0。总结:
可变对象传参后,修改对象的属性或内部元素会影响原对象;但如果直接给函数内的参数变量重新赋值(绑定新对象),不会对外部的原变量产生任何影响。
内容的提问来源于stack exchange,提问作者chipoyu
相关产品推荐
相关产品推荐

