23
Truel=""
count = 0
finle_touch=False #true after it find the first 3 upperletter

# check if there is 1 lower letter after three upper letter
def one_lower(i):
    count=0
    if i == i.lower:
        finle_touch=True
        Truel=i

# check for 3 upper letter
def three_upper(s):
    for i in s:
        if count == 3:
            if finle_touch==True:
                break
            else:
                one_lower(i)
        elif i == i.upper:
            count +=1
            print(count) #for debug
        else:
            count ==0
            finle_touch=False

stuff="dsfsfFSfsssfSFSFFSsfssSSsSSSS......."
three_upper(stuff)
print(Truel)

所以我有很多关于“东西”的字符串,我喜欢找到被 3 个大写字母包围的 1 个小写字母。

但是当我运行这段代码时,我得到:

Traceback (most recent call last):
  File "C:\Python33\mypy\code.py", line 1294, in <module>
    three_upper(stuff)
  File "C:\Python33\mypy\code.py", line 1280, in three_upper
    if count == 3:
UnboundLocalError: local variable 'count' referenced before assignment

我不明白为什么。

4

2 回答 2

40

由于这一行count +=1,python 认为这count是一个局部变量,并且在您使用时不会搜索全局范围if count == 3:。这就是你得到这个错误的原因。

使用global语句来处理:

def three_upper(s): #check for 3 upper letter
    global count
    for i in s:

来自文档

函数中的所有变量赋值都将值存储在局部符号表中;而变量引用首先在局部符号表中查找,然后在全局符号表中查找,然后在内置名称表中查找。因此,全局变量不能在函数内直接赋值(除非在全局语句中命名),尽管它们可以被引用。

于 2013-07-06T20:45:49.043 回答
2

在这种情况下,使用 nonlocal 实际上会更好。尽可能少地使用全局。有关非本地的更多信息, 请参见 docs.python.org/3/reference/simple_stmts.html#nonlocal

于 2015-10-29T23:19:47.770 回答