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

Python函数传参疑问:为何number变量未随num +=1语句递增?

为什么执行num +=1后外部的number变量值没变化?

先看这段代码:

def increment(c, num):
    c.count += 1
    num += 1


class Counter:
    def __init__(self):
        self.count = 0
 

counter = Counter()
number = 0
 
for i in range(0, 100):
    increment(counter, number)
 
print(
    "counter is "
    + str(counter.count)
    + ", number of times is "
    + str(number)
)

运行结果是:

counter is 100, number of times is 0

明明函数里执行了num +=1,为啥外部的number还是0?


核心原因是Python的参数传递规则和对象的可变性:

  • Python里的参数传递是「传对象引用」,但要分两种对象看待:
    1. 不可变对象(比如int、str、tuple):像number是int类型,属于不可变对象。当你把它传给函数里的num参数时,num拿到的是指向0这个对象的引用。但执行num +=1时,因为int不能被修改,实际上是创建了一个新的整数对象1,然后让函数里的num指向这个新对象——但外部的number还是原来指向0的那个引用,所以外部的值完全没变化。
    2. 可变对象(比如自定义类实例、列表、字典):Counter是自定义类的实例,属于可变对象。函数里的c和外部的counter指向同一个对象,当你修改c.count时,是直接在这个对象内部修改属性,所以外部的counter能看到这个变化,最终count变成了100。

如果想要让外部的number也跟着变,有两种常见办法:

  • 让函数返回修改后的num,然后外部重新赋值:
    def increment(c, num):
        c.count +=1
        num +=1
        return num
    
    # 循环里改成:
    number = increment(counter, number)
    
  • 用可变对象包装这个整数(比如列表),这样修改内部值就能影响外部:
    def increment(c, num_list):
        c.count +=1
        num_list[0] +=1
    
    number = [0]
    for i in range(0,100):
        increment(counter, number)
    print("number of times is", number[0]) # 输出100
    

内容的提问来源于stack exchange,提问作者zum809

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:27:24