1

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
4

2 に答える 2

10

これを行うと、オブジェクトtester = handへの新しい参照を作成するだけになりhandます。つまり、testerhand同じオブジェクトです。あなたが彼らをチェックしたならば、あなたはこれを見ることができましたid

print id(tester)
print id(hand)  #should be the same as `id(tester)`

または同等に、is演算子と比較します。

print tester is hand  #should return `True`

辞書のコピーを作成するには、次の.copy方法を利用できます。

tester = hand.copy()
于 2013-01-30T04:41:42.290 に答える
5

tester = handのコピーを作成していない場合は、hand同じオブジェクトへの新しい参照を作成しています。行った変更はすべてtesterに反映されhandます。

tester = hand.copy()これを修正するために使用します:http: //docs.python.org/2/library/stdtypes.html#dict.copy

于 2013-01-30T04:41:58.640 に答える