2017-12-20 5 views
0

どのようにして.setdefaultを使用するのですか?たとえば、.setdefaultには関数リストが埋め込まれています

import random 
foundwords = [] 

with open("text", "r") as file: 
    contents = file.read().replace('\n',' ') 
words = contents.split(' ') 

def findwords(word): 
    for i in range(len(words) - 1): 
     if words[i] == word: 
      if not words[i + 1] == '': 
       foundwords.append(words[i + 1]) 

wordsDict = {} 
for i in range(len(words) - 1): 
    findwords(words[i]) 
    wordsDict.setdefault(words[i], foundwords) 
    del foundwords[:] 

def assemble(): 
    start = words[random.randint(0, len(words))] 
    print(start.capitalize()) 



assemble() 

私がwordsDictをチェックすると、すべてのリストは空です。しかし、リストとなっています。

+0

'assemble()'関数はこの問題と何が関係していますか? – Barmar

答えて

1

.setdefault()を使用すると、foundwordsリストのコピーが作成されないため、すべての辞書要素が同じリストを参照します。次に、そのリストのすべての要素をdel foundwords[:]で削除するので、それらはすべて空のリストを参照します。

リストに辞書を追加するときに、リストのコピーを作成します。

for word in words: 
    findwords(word) 
    wordsDict.setdefault(word, foundwords[:]) 
    del foundwords[:] 

良いので、それは代わりにグローバル変数への書き込みの新しいリストを返すfindwords()を変更することです。

def findwords(word): 
    foundwords = [] 
    for i in range(len(words) - 1): 
     if words[i] == word: 
      if not words[i + 1] == '': 
       foundwords.append(words[i + 1]) 
    return foundwords 

for words in words: 
    wordsDict.setdefault(word, findwords(word)) 
+0

IMHO関数が呼び出されるか、またはdict内の値が_is_であってもリストがコピーされるので、両方の方法が最適ではありません。 'setdefault'を使うのではなく、単純な' if'を使うのが良いでしょう。 –

関連する問題