当您在类/函数内部和外部声明同名变量时,您如何知道将使用哪个变量值?

时间:2018-04-11 04:28:02

标签: python globals locals

<div>
   <script type="text/rocketscript" data-rocketoptimized="true">var onloadCallback = function() {grecaptcha.render('recaptcha', {'sitekey' : 'blahblah-QBB', 'theme' : 'light' });};</script>
   <div id="recaptcha">
      <div>
         <div style="width: 302px; height: 422px; position: relative;">
            <div style="width: 302px; height: 422px; position: absolute;">
               <iframe src="https://www.google.com/recaptcha/api/fallback?k=blahblah&amp;hl=en&amp;v=vxxxxxxx&amp;t=xxxxx" frameborder="0" scrolling="no" style="width: 302px; height: 422px; border-style: none;">
               </iframe>
            </div>
         </div>
         <div style="border-style: none; bottom: 12px; left: 25px; margin: 0px; padding: 0px; right: 25px; background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px; height: 60px; width: 300px;">
            <textarea id="g-recaptcha-response" name="g-recaptcha-response" class="g-recaptcha-response" style="width: 250px; height: 40px; border: 1px solid #c1c1c1; margin: 10px 25px; padding: 0px; resize: none; ">
            </textarea>
         </div>
      </div>
   </div>
   <script async="" defer="" data-rocketsrc="https://www.google.com/recaptcha/api.js?onload=onloadCallback&amp;render=explicit" type="text/rocketscript" data-rocketoptimized="true"></script>
</div>

输出:[42,43,44]

VS

a=0
b=1
class A:
    a=42
    b=list((a,a+1,a+2))
x=A()
print(x.b)

输出:[0,1,2]

所以在第一个例子中,使用了a = 42。但在第二个例子中,使用了a = 0。为什么会这样?

1 个答案:

答案 0 :(得分:0)

好的,我在教授的幻灯片中找到了这个推理:

&#34;类块中定义的名称范围仅限于类块;它没有扩展到方法的代码块 - 这包括了解和生成器表达式,因为它们是使用函数作用域实现的。&#34; - 赵一宝博士

所以在示例2中,list((范围(3)中的i的a + i))是列表推导的示例。因此,它采用全局命名空间a = 0。它不识别a = 42,因为它是在类块A()中定义的。

希望有人可以审查我的推理,我不确定它是否完全正确。