1. 首页
  2. Python

奇怪的Python函数作用域行为

“u003Cdivu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F24da8fc0a5aa4a78b20c15b5352d3a62″ img_width=”800″ img_height=”450″ alt=”奇怪的Python函数作用域行为” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E我对这种范围行为感到困惑:u003Cu002Fpu003Eu003Cpreu003Eclass Bar:u003Cbru003E def __init__(self):u003Cbru003E for fn in [“open”,”openW”,”remove”,”mkdir”,”exists”,”isdir”,”listdir”]:u003Cbru003E print “register”, fnu003Cbru003E def func_wrapper(filename):u003Cbru003E print “called func wrapper”, fn, filenameu003Cbru003E setattr(self, fn, func_wrapper)u003Cbru003Ebar = Bar()u003Cbru003Ebar.open(“a”)u003Cbru003Ebar.remove(“b”)u003Cbru003Ebar.listdir(“c”)u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E这给出了输出:u003Cu002Fpu003Eu003Cpreu003Eregister openu003Cbru003Eregister openWu003Cbru003Eregister removeu003Cbru003Eregister mkdiru003Cbru003Eregister existsu003Cbru003Eregister isdiru003Cbru003Eregister listdiru003Cbru003Ecalled func wrapper listdir au003Cbru003Ecalled func wrapper listdir bu003Cbru003Ecalled func wrapper listdir cu003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E但是我希望这func_wrapper始终是正确的功能。我知道范围func_wrapper是整个函数,但是我在每次循环迭代中都重新定义了它,最后一个实例保存在属性中。我还尝试在的func_wrapper = None下面添加内容,setattr但这无济于事。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002F21a458ed45b64a5db9ed843c0bd904b2″ img_width=”224″ img_height=”173″ alt=”奇怪的Python函数作用域行为” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003Eu003Cstrongu003E解决方案u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E要么u003Cu002Fpu003Eu003Cpreu003Eclass Bar:u003Cbru003E def __init__(self):u003Cbru003E for fn in [“open”,”openW”,”remove”,”mkdir”,”exists”,”isdir”,”listdir”]:u003Cbru003E print “register”, fnu003Cbru003E def func_wrapper(filename, fn=fn):u003Cbru003E print “called func wrapper”, fn, filenameu003Cbru003E setattr(self, fn, func_wrapper)u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E或者更强大地u003Cu002Fpu003Eu003Cpreu003Edef mkwrapper(fn):u003Cbru003E def func_wrapper(filename):u003Cbru003E print “called func wrapper”, fn, filenameu003Cbru003E func_wrapper.__name__ = fnu003Cbru003E return func_wrapperu003Cbru003Eclass Bar:u003Cbru003E def __init__(self):u003Cbru003E for fn in [“open”,”openW”,”remove”,”mkdir”,”exists”,”isdir”,”listdir”]:u003Cbru003E print “register”, fnu003Cbru003E func_wrapper = mkwrapper(fn)u003Cbru003E setattr(self, fn, func_wrapper)u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E在您的原始示例中,所有生成的函数都访问相同的外部变量fn,该变量在每次循环运行中都会更改。在更正的示例中,这是可以避免的。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fdfic-imagehandleru002Fe2415c5b-f3c2-423d-a2d7-8308cc90a332″ img_width=”1200″ img_height=”800″ alt=”奇怪的Python函数作用域行为” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003Eu003Cstrongu003E最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fdivu003E”

原文始发于:奇怪的Python函数作用域行为

主题测试文章,只做测试使用。发布者:逗乐男神i,转转请注明出处:http://www.cxybcw.com/12852.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code