首页 > 解决方案 > 使用 for 循环中的局部变量作为字典键的名称会覆盖先前的键

问题描述

当我尝试使用i+1我的字典添加一个值作为我的 for 循环中的名称时,它会替换前一个键,即使它们在技术上具有单独的名称。我目前正在尝试做的是制作一个加密系统,为了做到这一点,我让它随机生成一个关键字,然后将该关键字放入一个分隔每个单独字符的列表中。这很好用,无论如何我正在使用字典来尝试在一定程度上制作软编码变量。我希望每个字符都有一个变量,以便以后可以引用它们,而不是从零开始覆盖很多变量。让我向您展示我到目前为止的代码。

import urllib.request
import random

word_url = "http://svnweb.freebsd.org/csrg/share/dict/words?view=co&content-type=text/plain"
response = urllib.request.urlopen(word_url)
long_txt = response.read().decode()
words = long_txt.splitlines()
keyword = random.choice(words)

def split(word):
    return list(word)
def getLetters(word):
    localvar1 = list(word)
    localvar2 = len(localvar1)
    for i in range(localvar2):
        global letters
        letters = {}
        letters[i+1] = localvar1[i].copy()
        print(letters)
def printLetters():
    for i in range(len(letters)):
        try:
            print(letters[1+i])
        except:
            ValueError

这就是专门制作字典的代码的所有代码都在这里。

def getLetters(word):
    localvar1 = list(word)
    localvar2 = len(localvar1)
    for i in range(localvar2):
        global letters
        letters = {}
        letters[i+1] = localvar1[i].copy()
        print(letters)

我认为问题在于,i+1即使每次 for 循环,循环 i 的值都会增加,它仍将其识别为单数名称。我已经尝试了我能想到的一切,这是我最后的手段。我几乎看过每一篇我能看懂的在线文章,尽管我可能遗漏了一些东西。我尝试使用__setitem__从该列表和其他一些我不记得的东西创建新列表。我已经为此工作了几个小时,现在我只是头疼,任何帮助将不胜感激。

标签: pythonpython-3.xdictionaryfor-loopnaming-conventions

解决方案


它覆盖了变量,因为您在循环中将其重新定义为空白字典,然后只在其中放入一个值。将这两条线移到循环之外,它是固定的。此外,您不需要使用那些局部变量,只需使用枚举。

def getLetters(word):
    global letters
    letters = {}
    for i, letter in enumerate(word, 1):
        letters[i] = letter
    print(letters)

这打印:

{1: 'W', 2: 'h', 3: 'i', 4: 't', 5: 'c', 6: 'o', 7: 'm', 8: 'b'}

请注意,我并不完全容忍这种做法,因为这样做非常不合常规。为什么不只返回字典并在调用它时将结果分配给一个变量,那么现在它在这个上下文中是一个全局值。一个简单的 dict 理解也将完全符合您的要求:

def getLetters(word):
    return {i:l for i, l in enumerate(word, 1)}

letters = getLetters(keyword)

编辑或@furas 如此巧妙地提到,只需使用:

return dict(enumerate(word, 1))

这一切都说我不相信你甚至真的需要这个功能。要获取此 dict 中的第二个字母,您将使用letters[2]它,而如果它只是作为字符串值保留,则可以将其与列表类似地对待,因此keyword[1]结果相同,或者仅keyword[i+1]在您必须让第一个索引从 1 开始时使用.


推荐阅读