42

私も答えを探してみましたが、他の人の同様の問題に対する答えがわかりません...

tfile= open("/home/path/to/file",'r') 

def temp_sky(lreq, breq):
    for line in tfile:
        data = line.split()
        if (    abs(float(data[0]) - lreq) <= 0.1 
            and abs(float(data[1]) - breq) <= 0.1):            
            T= data[2]
    return T
print temp_sky(60, 60)
print temp_sky(10, -10)

次のエラーが発生します

7.37052488
Traceback (most recent call last):
File "tsky.py", line 25, in <module>
  print temp_sky(10, -10)
File "tsky.py", line 22, in temp_sky
  return T
UnboundLocalError: local variable 'T' referenced before assignment

最初のprintステートメントは正しく機能しますが、2番目のステートメントでは機能しません。Tをグローバル変数にしようとしましたが、これで両方の答えが同じになります。助けてください!

4

7 に答える 7

40

ifステートメントは常に false でありT、条件が満たされた場合にのみ初期化されるため、コードはT値を取得するポイントに到達しません (それにより、定義/バインドされます) 。常に実行される場所に変数を導入する必要があります。

試す:

def temp_sky(lreq, breq):
    T = <some_default_value> # None is often a good pick
    for line in tfile:
        data = line.split()
        if abs(float(data[0])-lreq) <= 0.1 and abs(float(data[1])-breq) <= 0.1:
            T = data[2]
    return T
于 2013-03-12T17:17:00.113 に答える
5

他の答えは正しいです。デフォルト値はありません。ただし、ロジックには別の問題があります。

同じファイルを 2 回読み取ります。一度読み込んだ後はカーソルがファイルの最後にあるので、再度読み込もうとしても何も返らずループには入らない。これを解決するために、次の 2 つのことを行うことができます: 関数呼び出しごとにファイルを開く/閉じる:

def temp_sky(lreq, breq):
    with open("/home/path/to/file",'r') as tfile:
        # do your stuff

これには、毎回ファイルを開く必要があるという欠点があります。より良い方法は次のとおりです。

tfile.seek(0)

for line in tfile:ループの後にこれを行います。カーソルを先頭にリセットして、次の呼び出しがそこから再び開始されるようにします。

関連する質問:

于 2013-03-12T17:37:57.323 に答える
1

始める前に、あなたのスクリプトは私が持っていないファイルからデータを読み取るため、これを実際にテストすることはできないことに注意してください。

'T' は、宣言された関数のローカル スコープで定義されています。最初のインスタンスでは、上記の条件ステートメントが明らかに True と評価されるため、'data[2]' の値が 'T' に割り当てられます。関数の 2 回目の呼び出しで「UnboundLocalError」例外が発生するため、ローカル変数「T」が設定され、条件付き割り当てがトリガーされることはありません。

条件ステートメントに一致するファイル内のデータの最初のビットを返したいように見えるので、関数を次のように変更することをお勧めします。

def temp_sky(lreq, breq):
    for line in tfile:
        data = line.split()
        if ( abs(float(data[0]) - lreq) <= 0.1 and abs(float(data[1]) - breq) <= 0.1):            
            return data[2]
    return None

そうすれば、目的の値が見つかったときに返され、一致するデータが見つからない場合は「なし」が返されます。

于 2013-03-12T17:28:32.827 に答える
0

私は演習で同じ問題に直面していました。関連はありませんが、参考になるかもしれません。関数内に add_result = 0 を配置すると、エラーは発生しませんでした。それが役に立てば幸い!この回答が文脈にない場合はお詫び申し上げます。

user_input = input("Enter multiple values separated by comma > ")

def add_numbers(num_list):
    addition_result = 0
    for i in num_list:
        addition_result = addition_result + i
    print(addition_result)

add_numbers(user_input)
于 2015-05-11T04:26:17.463 に答える
0

フェリックスの例に貢献し、

class Battery():

    def __init__(self, battery_size = 60):
        self.battery_size = battery_size
    def get_range(self):
        if self.battery_size == 70:
            range = 240
        elif self.battery_size == 85:
        range = 270

        message = "This car can go approx " + str(range)
        message += "Fully charge"
        print(message)

条件が満たされていないため、メッセージが実行されないため、「 UnboundLocalError: local variable 'range' referenced before assign」

def get_range(self):
    if self.battery_size <= 70:
        range = 240
    elif self.battery_size >= 85:
        range = 270
于 2016-01-19T01:23:55.230 に答える
-1

このエラーを解決するには、そのループまたはステートメントの上でその変数を初期化するだけです。例えばvar a =""

于 2017-03-03T04:40:14.067 に答える