通常考虑其他语言的作用域规则,我有点假设 Python 的作用域规则与全局变量相似,直到我在下面的代码中遇到变量计数问题:
count=1
def intPermute(fix,var):
if len(var) ==2:
#import pdb
#pdb.set_trace()
print ("%d: %s%c%c" % (count, str(fix),var[0],var[1]))
count+=1
print ("%d: %s%c%c" % (count, str(fix),var[1],var[0]))
count+=1
else:
for i in range(len(var)):
intPermute(fix+var[i],var[:i]+var[i+1:])
def permuteStr(string):
# permute a string for nPn combinations basically n!
if string =="" or len(string) <=0:
return;
if len(string) <2:
print "%d: %s" % (count, str(string))
intPermute("",string)
我收到以下错误:文件“/Users/ns/permute2.py”,第 9 行, intPermute print ("%d: %s%c%c" % (count, str(fix),var[0], var[1])) UnboundLocalError:赋值前引用的局部变量“count”
为什么 python 范围规则定义为我无法访问函数 intPermute 内部范围(if 语句)内的全局变量计数?在函数的第一个语句范围级别可以访问相同的变量吗?这是为什么?我知道可以通过在函数中定义同名的局部变量来“覆盖”全局范围变量,但这里似乎并非如此。
我能够在 intPermute 函数的开头添加以下语句来解决这个问题: 全局计数
def intPermute(fix,var):
global count
if len(var) ==2:
#import pdb
#pdb.set_trace()
print ("%d: %s%c%c" % (count, str(fix),var[0],var[1]))
count+=1
print ("%d: %s%c%c" % (count, str(fix),var[1],var[0]))
count+=1
else:
for i in range(len(var)):
intPermute(fix+var[i],var[:i]+var[i+1:])
现在,global 的这个含义对我来说并不明显,我认为 global 关键字是在全局范围内“导出”一个局部变量。
所以 2 个问题:1)为什么 Python 不允许在函数 intPermute 的二级范围内查看全局变量计数?虽然它可以在函数的第一级范围内访问?2)为什么全局关键字解决了这个问题?它是否总是适用于解决 1 级全局变量?
谢谢。