Python子例程末尾修改整型参数为何无法跨调用生效
问题产生原因
- Python函数的参数传递为对象引用传递,
int属于不可变类型,函数签名里的Number是仅存在于函数作用域的局部变量,和全局作用域下的同名Number变量没有绑定关系。 - 函数内执行
Number += 1时,因为整数不可修改,本质是创建了一个值为原数值+1的新整数对象,再把局部变量Number绑定到这个新对象上,这个修改完全不会影响全局作用域里始终为1的Number变量。函数运行结束后局部变量被回收,下次调用时传入的依然是全局的初始值1,自然每次追加到数组的都是1,不会递增。 - 你给出的示例代码还存在一个显性问题:
array没有在函数可访问的作用域内初始化,直接运行会抛出NameError异常。
实现可行性与修正方法
这个需求完全可以实现,原有写法的问题是对Python变量作用域、不可变类型的传递逻辑理解有误,不是需求本身不可行,常见的正确实现方式如下:
方案1:全局变量实现(不推荐,易引发状态污染)
如果只是简单测试,可以通过global关键字声明函数内操作的是全局计数变量,不需要把计数作为参数传入:
Number = 1 array = [] def Numberadd(): global Number array.append(Number) Number += 1 # 调用测试 Numberadd() Numberadd() Numberadd() print(array) # 输出 [1, 2, 3]
方案2:闭包封装状态(推荐,无全局变量污染)
更规范的写法是把计数状态、存储数组封装在闭包作用域内,避免全局变量带来的逻辑冲突:
def create_counter(): count = 1 store_array = [] def add_num(): nonlocal count store_array.append(count) count += 1 return store_array return add_num # 初始化计数追加函数 Numberadd = create_counter() # 调用测试 Numberadd() Numberadd() print(Numberadd()) # 输出 [1, 2, 3]
内容的提问来源于stack exchange,提问作者Hydracode
相关产品推荐
相关产品推荐

