You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:15:45