MIT Open Courseware を介して Python の自習を行っていたところ、以下のコードで問題が発生しました。この関数を単独で、または別の関数内で実行すると、最初に渡された値「hand」が変更されますが、その理由はわかりません。2 つのローカル変数 (hand0 と tester) を hand に設定します。1 つ目は初期値を保持し、2 つ目は反復します。ただし、3つすべてが変更されますが、「テスター」だけが変更することを期待しています。「手」を変更する以外は、機能は期待どおりに機能します。
(関数に渡される値は、設定されたパラメーター内で異なります。word_list は有効な英単語のリスト、word はテスト用にこの関数内で置換する文字列、hand は文字とそれに関連するカウントの辞書です。デバッグ コードはコメント化されています。 .)
def is_valid_word(word, hand, word_list):
"""
Returns True if word is in the word_list and is entirely
composed of letters in the hand. Otherwise, returns False.
Does not mutate hand or word_list.
word: string
hand: dictionary (string -> int)
word_list: list of lowercase strings
"""
hand0 = hand
tester = hand
#display_hand(hand)
#display_hand(tester)
word = raw_input('test word: ')
length = len(word)
disc = True
for c in range(length):
if word[c] in tester.keys() and tester[word[c]]>0:
#print tester[word[c]]
#display_hand(hand)
#display_hand(tester)
tester[word[c]]=tester[word[c]]-1
else:
#print 'nope'
disc = False
if word not in word_list:
disc = False
#print disc
#display_hand(hand)
#display_hand(tester)
#display_hand(hand0)
return disc