回应模式 - No.64382723


No.64382723 - 技术宅


无标题无名氏No.64382723 只看PO

2024-11-13(三)23:45:48 ID:XJzHWCJ 回应

肥哥们,在学python,有些疑问,请看
def f(fun):
print(10)
outvar=1
tbc=2
def inn(arg):
nonlocal tbc
print(outvar)
tbc+=1
print(f'{tbc =}')
return fun(arg)
return inn

c=f.__code__

c.co_varnames
#('fun','inn')
c.co_cellvars
#('fun', 'outvar', 'tbc')
为什么outvar和tbc不在co_varnames中呢?这两个也是局部变量吧(つд⊂)
jp

Tips无名氏No.9999999

2099-01-01 00:00:01 ID: Tips

总之先R ⑨ [1,100]

无标题无名氏No.64382752

2024-11-13(三)23:48:41 ID: XJzHWCJ (PO主)

我缩进没了( ゚∀。)
刚刚交互台关掉了,用记事本复现一下

无标题无名氏No.64383074

2024-11-14(四)00:15:46 ID: ECoMLCH

你闭包了,现在它们是闭包变量

无标题无名氏No.64383658

2024-11-14(四)01:18:56 ID: ECoMLCH

>>No.64383074
你说的那几个变量储存在,f函数return的那个inn的inn.__closure__里

无标题无名氏No.64383689

2024-11-14(四)01:22:26 ID: ECoMLCH

>>No.64382723
这样的原因很好解释,当f函数运行结束后f的局部变量会被释放,但是由于inn还需要使用这些变量,所以就建立了这个机制保证这些变量的引用

无标题无名氏No.64393181

2024-11-14(四)23:49:05 ID: XJzHWCJ (PO主)

>>No.64383689
谢谢肥哥解答(つд⊂)
不过fun也被访问了吧,还是说函数的形参都会加入co_varnames( ゚∀。)