直接在locals().keys()中检测多个变量为何失败?
问题:直接在any()生成器中调用locals()检测变量存在性返回False?
在Spyder控制台做了以下测试:
- 定义局部变量:
>>> LatLim = (36.033333,36.2333) >>> LongLim = (-5.5333,-5.25) >>> locals().keys() dict_keys(['__name__', '__builtin__', ... 'LatLim', 'LongLim', ... ])
- 单独检测每个变量均返回True:
>>> 'LatLim' in locals().keys() True >>> 'LongLim' in locals().keys() True
- 但用
any()批量检测时返回False:
>>> any( key in locals().keys() for key in ('LatLim','LongLim') ) False
- 先将
locals().keys()存入变量再检测则成功:
>>> LocalsKeys = locals().keys() >>> any( key in LocalsKeys for key in ('LatLim','LongLim') ) True
为什么直接检测locals().keys()时批量验证会失败?
原因分析
核心问题出在生成器表达式的作用域特性:
- 当你在
any()中使用生成器表达式(key in locals().keys() for key in ...)时,生成器在迭代执行时会创建自己的局部作用域。每次调用locals(),返回的都是这个生成器内部的局部作用域字典,而非外层控制台的全局/局部作用域。 - 生成器内部的局部作用域里并没有
LatLim和LongLim这两个变量,所以每次检测都会返回False,最终any()的结果就是False。
而先把locals().keys()赋值给变量LocalsKeys时,这个变量捕获的是外层控制台的局部作用域的键集合。之后在生成器里用这个变量检测,自然能匹配到目标键,返回True。
内容的提问来源于stack exchange,提问作者user2153235
相关产品推荐
相关产品推荐

