2017-12-20 3 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() 

내가 단어를 확인하면 모든 목록이 비어 있습니다. 그러나 목록 으로 채워져 있습니다.

+0

무엇이'assembl()'함수가이 문제와 관련이 있습니까? – 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'를 사용하십시오. –

관련 문제