2017-04-04 18 views
0

私は自分の関数で何かが間違っていると思っていますが、私はまだPythonと関数一般にかなり新しいです。以下のコードでは、関数に値を送信しませんが、関数がデータベースを読み込むと、データベースから値をメインプログラムに戻すことができます。関数の中にprintステートメントを置いて、データベースから値を引き出し、すべてが正しく動作することを確認しました。メインエリアの関数呼び出しの直後に同じ印刷行をコピーして貼り付けましたが、NameError: 'wins' is not definedが表示されています。これは、私が正しく値を返さないと信じさせてくれるのですか?Python3関数戻り値

#Python3 
import pymysql 

def read_db(): 
    db = pymysql.connect(host='**********',user='**********',password='**********',db='**********') 
    cursor = db.cursor() 
    sql = "SELECT * FROM loot WHERE id = 1" 
    cursor.execute(sql) 
    results = cursor.fetchall() 
    for row in results: 
     wins = row[2] 
     skips = row[3] 
     lumber1 = row[4] 
     ore1 = row[5] 
     mercury1 = row[6] 
    db.commit() 
    db.close() 
    print ("Wins = ",wins," Skips = ",skips," Lumber = ",lumber1," Ore = ",ore1," Mercury = ",mercury1) 
    return (wins, skips, lumber1, ore1, mercury1) 

read_db() 
print ("Wins = ",wins," Skips = ",skips," Lumber = ",lumber1," Ore = ",ore1," Mercury = ",mercury1) 
+0

関数(またはクラス)で宣言された変数は、関数(またはクラス)の外には存在しません。これは異なる文脈で異なることをしている異なる変数に同じ名前を使うことができるので、互いに干渉しないでしょう。呼び出す関数で使用される変数名についても気にする必要はありません。これは "レキシカルスコープ"と呼ばれ、非常に便利であり、現代のすべての言語で使用されています(ただし、発明するのに驚くほど時間がかかりましたが)。しかし、これは、後で使用したい場合は、関数の戻り値に名前を割り当てる必要があることを指摘しています。 –

答えて

2

を使用する必要がありますが、戻り値が出てスローされます。あなたは、変数に戻り値を代入する必要があります。

wins, skips, lumber, ore = read_db() 

あなたはwins変数はあなたからread_db()を呼び出すスコープで利用可能になるという意味ではありませんwinsと呼ばれる変数を返しているという事実。戻り値を明示的に割り当てる必要があります。

1

関数内で宣言する変数は、関数のスコープ内にのみ存在します。

あなただけread_db()を行う

ins, skips, lumber1, ore1, mercury1 = read_db() 
+0

Typo:返されたタプルの最初の要素を 'wins'と呼んで、与えられた例と一致させることを考えました。 –