为什么Python循环中每次对counter加1后变量仍不更新?
问题成因
核心是Python的变量作用域规则+不可变对象传参特性:
- 全局变量
counter是整数类型,属于不可变对象,作为参数传入函数时,传递的是值的拷贝,不是内存引用 - 函数
loo的入参counter是函数内的局部变量,和全局的counter只是同名,属于两个完全独立的变量。函数内执行counter+=1修改的只是局部变量的值,不会对全局的counter产生任何影响 - 每次while循环调用
loo(counter)时,传入的都是全局counter的初始值1,所以永远返回2,全局变量从未被更新
解决方法
有三种常用方案,优先选第一种,无副作用逻辑最清晰:
方案1:用函数返回值更新全局变量
每次调用函数后,把返回的新值重新赋值给全局counter:
counter = 1 def loo(counter): counter+=1 return counter while 1: counter = loo(counter) print(counter)
方案2:用global关键字声明使用全局变量
直接在函数内声明操作的是全局的counter,不需要再传参:
counter = 1 def loo(): global counter counter+=1 return counter while 1: print(loo())
注意:该方案会让函数依赖全局变量,可复用性下降,非必要不推荐使用
方案3:将counter放入可变容器中传递
如果需要同时传递多个状态,可以把counter放到列表等可变对象中,可变对象传参时传递的是引用,修改会同步到外部:
counter = [1] def loo(cnt): cnt[0] +=1 return cnt[0] while 1: print(loo(counter))
内容的提问来源于stack exchange,提问作者Saw
相关产品推荐
相关产品推荐

