Wörterbuch zwischen Objekten ohne Grund geteilt?

Mit dem folgenden Code soll eine neue (geänderte) Version einer Häufigkeitsverteilung (nltk.FreqDist) erstellt werden. Beide Variablen sollten dann gleich lang sein.

Es funktioniert einwandfrei, wenn eine einzelne Instanz von WebText erstellt wird. Wenn jedoch mehrere WebText-Instanzen erstellt werden, scheint die neue Variable von allen Objekten gemeinsam genutzt zu werden.

Zum Beispiel:

import nltk
from operator import itemgetter

class WebText:

    freq_dist_weighted = {}

    def __init__(self, text):
        tokens = nltk.wordpunct_tokenize(text) #tokenize
        word_count = len(tokens)
        freq_dist = nltk.FreqDist(tokens)


        for word,frequency in freq_dist.iteritems():
            self.freq_dist_weighted[word] = frequency/word_count*frequency
        print len(freq_dist), len(self.freq_dist_weighted)

text1 = WebText("this is a test")
text2 = WebText("this is another test")
text3 = WebText("a final sentence")

Ergebnisse in

4 4
4 5
3 7

Welches ist falsch. Da ich nur Werte transponiere und ändere, sollten in jeder Spalte die gleichen Zahlen stehen. Wenn ich freq_dist_weighted kurz vor der Schleife zurücksetze, funktioniert es einwandfrei:

import nltk
from operator import itemgetter

class WebText:

    freq_dist_weighted = {} 

    def __init__(self, text):
        tokens = nltk.wordpunct_tokenize(text) #tokenize
        word_count = len(tokens)
        freq_dist = nltk.FreqDist(tokens)
        self.freq_dist_weighted = {}

        for word,frequency in freq_dist.iteritems():
            self.freq_dist_weighted[word] = frequency/word_count*frequency
        print len(freq_dist), len(self.freq_dist_weighted)

text1 = WebText("this is a test")
text2 = WebText("this is another test")
text3 = WebText("a final sentence")

ergibt (richtig):

4 4
4 4
3 3

Das ergibt für mich keinen Sinn.

Ich verstehe nicht, warum ich es zurücksetzen müsste, da es innerhalb der Objekte isoliert ist. Mache ich etwas falsch?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage