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

