首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数填充列表的.setdefault

函数填充列表的.setdefault
EN

Stack Overflow用户
提问于 2017-12-20 21:20:29
回答 1查看 33关注 0票数 0

如何使用.setdefault,默认情况下是我填写了一个函数的列表?例如,

代码语言:javascript
复制
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时,所有列表都是空的。不过,我知道名单已填写完毕。

EN

回答 1

Stack Overflow用户

发布于 2017-12-20 21:29:16

在使用foundwords时,不会复制.setdefault()列表,因此所有字典元素都引用相同的列表。然后使用del foundwords[:]删除该列表的所有元素,因此它们都引用了该空列表。

将列表添加到字典中时,请将其复制一份。

代码语言:javascript
复制
for word in words:
    findwords(word)
    wordsDict.setdefault(word, foundwords[:])
    del foundwords[:]

最好是修改findwords(),这样它就会返回一个新的列表,而不是写入全局变量。

代码语言:javascript
复制
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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47914515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档