变量在python中的作用域,它为什么工作?
在下面的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])
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,并喜欢它:^)