0

次のコードでは、メソッドが呼び出されるたびに 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で作業しています

4

3 に答える 3

2

「それを確認する方法は何ですか?」というあなたの質問に答えるために。、毎回同じオブジェクトが使用されているかどうかを確認できます。

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
于 2014-05-20T11:21:36.233 に答える
2

はい、そうなります。これを回避するには、一度だけ評価されるようにデフォルトの引数として渡すことができます。

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)
于 2014-05-20T11:16:11.697 に答える
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()呼び出しに対してローカルではないことに注意してください。

于 2014-05-20T11:16:18.313 に答える