web-dev-qa-db-ja.com

Pythonで割り当て前に参照されるローカル変数

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

理由がわかりません。前もって感謝します

17
Or Halimi

この行により、count +=1 pythonはcountがローカル変数であり、if count == 3:を使用したときにグローバルスコープを検索しないと考えています。そのエラーが発生しました。

globalステートメントを使用して、それを処理します。

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

docs から:

関数内のすべての変数割り当ては、ローカルシンボルテーブルに値を保存します。一方、変数参照は、最初にローカルシンボルテーブルを調べ、次にグローバルシンボルテーブルを調べ、次に組み込み名のテーブルを調べます。したがって、グローバル変数は、(グローバルステートメントで名前が指定されていない限り)関数内で値を直接割り当てることはできませんが、参照される場合があります。

30

この場合、実際には非ローカルを使用することをお勧めします。できるだけ控えめにグローバルを使用してください。非ローカルの詳細はこちら docs.python.org/3/reference/simple_stmts.html#nonlocal

1
Colin Schoen