次のコードでは、メソッドが呼び出されるたびに grade_to_score 辞書が作成されるかどうかを知りたいですか?
def get_score(grade):
grade_to_score = {'A': 10, 'B': 8, 'C': 6, 'D': 4, 'F': 0} # step 1
return grade_to_score.get(grade, -1)
また、それを確認する方法は何ですか?私はPython 2.7で作業しています
次のコードでは、メソッドが呼び出されるたびに grade_to_score 辞書が作成されるかどうかを知りたいですか?
def get_score(grade):
grade_to_score = {'A': 10, 'B': 8, 'C': 6, 'D': 4, 'F': 0} # step 1
return grade_to_score.get(grade, -1)
また、それを確認する方法は何ですか?私はPython 2.7で作業しています
「それを確認する方法は何ですか?」というあなたの質問に答えるために。、毎回同じオブジェクトが使用されているかどうかを確認できます。
def get_score(grade):
grade_to_score = {'A': 10, 'B': 8, 'C': 6, 'D': 4, 'F': 0} # step 1
print(id(grade_to_score)) # check object ID
return grade_to_score.get(grade, -1)
これで、次のように呼び出すことができます。
>>> a = get_score("")
50252080
>>> b = get_score("")
50249920
>>> c = get_score("")
50249776
異なるid
とは異なるオブジェクトを意味するため、呼び出しごとgrade_to_score
に明らかに新しく作成されます。for
興味深いことに、これはループで呼び出した場合には起こりません:
>>> for _ in range(3):
a = get_score("")
50249920
50249920
50249920
>>> scores = [get_score(grade) for grade in "ABC"]
53737032
53737032
53737032
はい、そうなります。これを回避するには、一度だけ評価されるようにデフォルトの引数として渡すことができます。
def get_score(grade, grade_to_score = {'A': 10, 'B': 8, 'C': 6, 'D': 4, 'F': 0}):
return grade_to_score.get(grade, -1)
またはより良いアプローチ:
def get_score(grade, grade_to_score = None):
if grade_to_score == None:
grade_to_score = {'A': 10, 'B': 8, 'C': 6, 'D': 4, 'F': 0}
return grade_to_score.get(grade, -1)
はい、辞書は関数が呼び出されるたびに新しく作成されます。
代わりにグローバルにするか、関数のデフォルトにすることができます。
grade_to_score = {'A': 10, 'B': 8, 'C': 6, 'D': 4, 'F': 0} # step 1
def get_score(grade):
return grade_to_score.get(grade, -1)
また
def get_score(grade, grade_to_score={'A': 10, 'B': 8, 'C': 6, 'D': 4, 'F': 0}):
return grade_to_score.get(grade, -1)
2 番目のケースgrade_to_score
では、ローカルとして関数に渡されるため、ルックアップが (わずかに) 高速になります。
どちらの場合も、辞書リテラルはモジュールのインポート時に一度実行されます。どちらの場合も、grade_to_score
は変更可能な辞書であるため、それに加えた変更はグローバルであり、get_score()
呼び出しに対してローカルではないことに注意してください。