2017-12-08 5 views
0

は、私のコードの関連部分である:私はcalculate_TFDIFメソッドを実行すると、私は後者のみ辞書の値をしたいとき両方のディクショナリの値が更新されるのはなぜですか?ここでは(PythonのOOP)

class Document: 
    def __init__(self): 
     self.term_frequency_per_document = {} 
     self.document_frequency = {} 
     self.term_freq_inv_doc_freq = {} 
     self.file = None 
     self.student_list = [] 
     self.index = 0 

    def calculate_TFIDF(self): 

     for key in self.term_frequency_per_document: 
      for value in self.term_frequency_per_document[key]: 
       self.term_freq_inv_doc_freq[key] = self.term_frequency_per_document.get(key) 
      for value in self.term_freq_inv_doc_freq[key]: 
       self.term_freq_inv_doc_freq[key][value] = \ 
        (self.term_freq_inv_doc_freq[key][value]) * \ 
        (math.log(26/float(self.document_frequency.get(value)))) 

     print (self.term_freq_inv_doc_freq) 
     print (self.document_frequency) 
     print (self.term_frequency_per_document) 

、両方self.term_frequency_per_documentself.term_freq_inv_per_doc辞書の値は、更新されています更新しました。私は間違ったアップデートがcalculate_TFDIFメソッドで発生していることを知っていますが、なぜそれがわかりません。

term_frequency_per_document辞書読み込みする必要があります。

{'student_1': {'love': 1, 'play': 2, 'watch': 1}, 'student_2': {'favorite': 2, 'hobby': 1} 

calculate_TFDIF方法を実行した後、term_freq_inv_doc_freq辞書読み込みする必要があります。

{'student_1': {'love': 1.6486586255873816, 'play': 2.121743921370525, 'watch': 1.8718021769015913} 'student_2': {'favorite': 1.9110228900548727, 'hobby': 1.1786549963416462} 

残念ながら、両方の辞書は、後者のように見えます。

+0

[MCVE]お知らせください。 (または少なくともこれをより読みやすくするために...) –

+0

'for'ループの中で' print() 'を使用して、どの値を取得して設定するかを確認してください。問題を見つけるのに役立ちます。 – furas

+0

どのように辞書を作成しますか?おそらく、同じ辞書を2つの変数に割り当て、両方の変数が同じデータをメモリ内で使用する場合もあります。 2つの分離された辞書を作成するには、 'copy.deepcopy()'を使う必要があります。 [pythontutor.com](http://pythontutor.com/)のコードを実行してPythonがどのようにオブジェクトにメモリを参照するかを見ることができます(pythontutorでコードを実行するときは矢印を参照) – furas

答えて

0

2つの変数に同じ辞書を割り当てて、両方の変数がメモリ内の同じデータを使用すると思われます。 2つの分離された辞書を作成するには、copy.deepcopy()を使用する必要があります。ところで

:あなたは、Pythonはオブジェクトイムメモリへの「参照」を使用する方法を参照してpythontutor.com上でコードを実行することができる(あなたがpythontutor上のコードを実行すると、「矢」を参照)

関連する問題