我有一个这样的代码段:
def A():
def B():
c.append("hello")
d = 8
c = []
d = 0
B()
print(c, d)
我得到以下输出:
["hello", 0]
我想使功能B
从功能c
到达d
和A
。它到达c
是因为它是list
,但我也想从d
到达B
。有没有简单的方法可以做到这一点?
答案 0 :(得分:2)
将d
声明为nonlocal
。这将使内部函数中的单元格“可写”。
c
之所以有效,是因为您正在就地对对象进行突变,但是Python的“隐式声明”(分配给变量)始终在本地范围内声明名称 。因此,当您尝试更新非局部变量或全局变量时,发生的事情是将同名变量声明为局部函数。
global
和nonlocal
语句将覆盖此隐式声明,而是声明指定名称的变量分别是模块全局的或在某些封闭函数范围内,而不是比该功能本地。然后,分配将“继承”到适当的范围,而不是隐式导致声明局部变量。
答案 1 :(得分:0)
一种简单的Python3
方法将如下所示直接访问该函数的局部变量。
def A():
def B():
c.append("hello")
A.d = 8 # <<
c = []
d = 0
B()
print(c, A.d) # <<
A()