2013-07-06 12 views
10
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) 

私は 'stuff'の文字列をたくさん持っていて、3つの大文字でソロントする小文字を1つ見つけるのが好きです。Pythonで代入される前に参照されているローカル変数

が、私はこのコードを実行したときに私が手:

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 

私は理由を理解していません。事前に感謝します

答えて

20

この行のためcountははローカル変数で、if count == 3:を使用した場合はグローバルスコープを検索しないと考えています。だからあなたはそのエラーを受けました。 docsから

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

使用globalはそれを処理するための文

機能ストア内のすべての変数への代入ローカル シンボルテーブルの値。変数参照はまずローカルの シンボルテーブルを参照し、次にグローバルシンボルテーブルを参照し、次に のビルトイン名を参照します。したがって、グローバル変数には、関数内の値(グローバルステートメントで指定されている場合を除き)を に直接割り当てることはできませんが、参照することはできますが です。

+0

ありがとう、私は関数の外側のvarはこの問題を解決しますが、だから私は関数でグローバル変数を使用するたびに私はそれをグローバルとして定義する必要がありますか? –

関連する問題