Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当您在类/函数内外声明一个名称相同的变量时,您如何知道将使用该变量的哪个值?_Python_Globals_Locals - Fatal编程技术网

Python 当您在类/函数内外声明一个名称相同的变量时,您如何知道将使用该变量的哪个值?

Python 当您在类/函数内外声明一个名称相同的变量时,您如何知道将使用该变量的哪个值?,python,globals,locals,Python,Globals,Locals,产出:[42、43、44] VS 输出:[0,1,2] 因此,在第一个示例中,使用了a=42。但在第二个示例中,使用了a=0。为什么会这样?好吧,我在教授的幻灯片中找到了这样的理由: “类块中定义的名称范围仅限于类块;它不扩展到方法的代码块-这包括理解和生成器表达式,因为它们是使用函数范围实现的。”-赵一宝博士 所以在示例2中,list((a+i表示范围(3)中的i))是列表理解的示例。因此,它采用全局名称空间a=0。它无法识别类块a()中定义的a=42 希望有人能审查我的推理,我不确定它是否完

产出:[42、43、44]

VS

输出:[0,1,2]


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

好吧,我在教授的幻灯片中找到了这样的理由:

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

所以在示例2中,list((a+i表示范围(3)中的i))是列表理解的示例。因此,它采用全局名称空间a=0。它无法识别类块a()中定义的a=42


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

这是一个有趣的问题,其真正的解决方案是“停止隐藏变量名”。我期待有人解释其内部(我认为后者与genexp有关,但似乎不是)
a=0
b=1
class A:
    a=42
    b=list((a,a+1,a+2))
x=A()
print(x.b)
a=0
b=1
class A:
    a=42
    b=list((a+i for i in range(3)))
x=A()
print(x.b)