如何让Python嵌套内部函数访问外部函数的不可变变量?
解决嵌套函数修改外部变量的问题
这事儿其实挺常见的,你遇到的核心问题是:不可变类型变量(比如整数、字符串)在嵌套函数里默认是只读的,而像列表这种可变类型,你修改它的内部元素时并没有重新赋值,所以能生效。要让函数B能修改A里的d,最简便直接的办法就是用nonlocal关键字,我给你一步步说明:
方法1:使用nonlocal关键字(推荐)
nonlocal专门用来告诉Python:“这个变量不是我内部定义的,而是来自外层嵌套函数的作用域,我要修改它”。修改后的代码如下:
def A(): def B(): nonlocal d # 声明d来自外层嵌套作用域 c.append("hello") d = 8 # 现在可以直接修改A里的d了 c = [] d = 0 B() print(c, d) # 输出:["hello", 8]
运行这段代码,就能得到你想要的结果——d被成功修改为8了。
方法2:把d放进可变对象里(兼容旧版Python)
如果你用的是Python 2(现在不太推荐了),没有nonlocal关键字,那可以像处理c一样,把d放到一个列表里,因为列表是可变类型,修改它的元素不需要重新赋值:
def A(): def B(): c.append("hello") d[0] = 8 # 修改列表里的元素 c = [] d = [0] # 把d包装成列表 B() print(c, d[0]) # 输出:["hello", 8]
不过这个方法需要额外的包装,不如nonlocal直观,所以还是优先用第一种方案。
内容的提问来源于stack exchange,提问作者Just_Me
相关产品推荐
相关产品推荐

