Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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_Python 2.7_Python 2.x - Fatal编程技术网

变量在python中的作用域,它为什么工作?

变量在python中的作用域,它为什么工作?,python,python-2.7,python-2.x,Python,Python 2.7,Python 2.x,在下面的python示例中,方法和属性似乎超出了范围,但它们仍然可以工作,发生了什么 for module in output: a = 1 attributes=[] methods=[] for branch in module[2]: for leaf in branch[2]: if leaf[0]=="method": methods.append(leaf[1])

在下面的python示例中,方法和属性似乎超出了范围,但它们仍然可以工作,发生了什么

for module in output:
    a = 1
    attributes=[]
    methods=[]
    for branch in module[2]:

        for leaf in branch[2]:
            if leaf[0]=="method":
                methods.append(leaf[1]) 
            if leaf[0]=="attribute":
                attributes.append(leaf[1])
print methods
print attributes
print module[0]
print a
但如果我再升一级,它就会停止工作

for filename in os.listdir("."):
    print filename
    fName, fExtension = os.path.splitext(filename)
    print fName, fExtension
    if fExtension == ".idl":
        f = open(filename)
        idl = f.read()
        f.close()
        output = parse(idl)
        pprint.pprint(output)
        root={}
        for module in output:
            a = 1
            attributes=[]
            methods=[]
            for branch in module[2]:
                for leaf in branch[2]:
                    if leaf[0]=="method":
                        methods.append(leaf[1]) 
                    if leaf[0]=="attribute":
                        attributes.append(leaf[1])
    print methods
    print module[0]
它说:NameError:未定义名称“方法”
我正在使用python 2.7,如注释中所示,
用于循环,
while
循环,
if
语句等。不要创建新的作用域。事实上,创建新作用域的只有函数、类、模块和方法。因此,当您在
for
循环内创建新变量时,该变量在该循环外可用,因为它们共享相同的范围。

如注释所示,
for
循环,
while
循环,
if
语句等不创建新范围。事实上,创建新作用域的只有函数、类、模块和方法。因此,当您在
for
循环内创建一个新变量时,该变量在该循环外可用,因为它们共享相同的作用域。

只有函数、类、方法和模块创建新的作用域。请注意,您也可以在
leaf
中尝试
for z in(1,2,3):打印z
,然后打印
z
<代码>z
已分配并在范围内!i、 将返回3。另一方面,列出理解@AaronNewton——列表理解在这方面的行为因python版本而异(2.x将循环变量“泄漏”到当前范围,而python 3.x显然没有)。我刚刚在2.7.3下对它进行了测试,确信我得到了“9”
>>I=0>>[I+1表示范围(10)][1,2,3,4,5,6,7,8,9,10]>>i9
只有函数、类、方法和模块创建了新的作用域。请看这一点,你也可以选择
leaf
,在(1,2,3)中尝试
表示z:print z
,然后
z
<代码>z
已分配并在范围内!i、 将返回3。另一方面,列出理解@AaronNewton——列表理解在这方面的行为因python版本而异(2.x将循环变量“泄漏”到当前范围,而python 3.x显然没有)。我刚刚在2.7.3下对它进行了测试,确信我得到了'9'
>>I=0>>[I+1代表范围(10)][1,2,3,4,5,6,7,8,9,10]>>i9
打印模块[0]
如果考虑到模块[2]
中的分支,
,这并不奇怪。似乎很有可能
output
产生了支持序列协议的东西(我把钱花在元组上)brakes@EduardFlorinescu--这可能会中断,因为
fExtension==”.idl:
的计算结果可能为
False
。这意味着,
if
语句中的代码永远不会执行,并且该变量永远不会添加到范围中(导致
namererror
)。True。事情就是这样。因此,我们需要小心定义变量的位置,因此实际上,通过在特定条件下定义变量或不定义变量,还存在范围的其他情况。这是一个很好的实践,即使作用域是全局局部的,如果在特定条件求值的范围外定义了变量,也不要使用它。@EduardFlorinescu--没问题。我们很乐意帮忙。希望您能像我一样长期使用Python:^)
打印模块[0]
如果您考虑到模块[2]
中的分支的几行代码,这并不奇怪。似乎很有可能
output
产生了支持序列协议的东西(我把钱花在元组上)brakes@EduardFlorinescu--这可能会中断,因为
fExtension==”.idl:
的计算结果可能为
False
。这意味着,
if
语句中的代码永远不会执行,并且该变量永远不会添加到范围中(导致
namererror
)。True。事情就是这样。因此,我们需要小心定义变量的位置,因此实际上,通过在特定条件下定义变量或不定义变量,还存在范围的其他情况。这是一个很好的实践,即使作用域是全局局部的,如果在特定条件求值的范围外定义了变量,也不要使用它。@EduardFlorinescu--没问题。我们很乐意帮忙。希望你能像我一样长时间地使用Python,并喜欢它:^)