Python 使用for循环中的局部变量作为字典键的名称会覆盖上一个键

Python 使用for循环中的局部变量作为字典键的名称会覆盖上一个键,python,python-3.x,dictionary,for-loop,naming-conventions,Python,Python 3.x,Dictionary,For Loop,Naming Conventions,当我尝试将I+1作为for循环中的名称添加到字典中时,它会替换上一个键,即使它们在技术上有单独的名称。我目前正在尝试做的是制作一个加密系统,为了做到这一点,我让它随机生成一个关键字,然后将该关键字制作成一个列表,将每个字符分开。这很好,不管怎么说,我使用字典是为了在一定程度上实现软编码变量。我希望每个字符都有一个变量,以便以后可以引用它们,而不是从零开始覆盖很多变量。让我给你看看我到目前为止的代码 import urllib.request import random word_url = "

当我尝试将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从这个列表和其他一些我记不起来的东西创建新的列表。我已经为此工作了好几个小时,现在我只是有点头痛,希望能得到任何帮助。

它会覆盖变量,因为您在循环中将它重新定义为一个空白字典,然后只在其中放入一个值。把那两条线移到环外,它就固定了。另外,您不需要使用这些局部变量,只需使用enumerate即可

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'}
请注意,我并不完全原谅这一点,因为这样做是非常不传统的。为什么不直接返回字典并在调用它时将结果分配给一个变量,那么现在它在这个上下文中是一个全局值呢。此外,一个简单的听写理解也能完全理解你想要做的事情:

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

letters = getLetters(keyword)
编辑或如@furas所说,只需使用:

return dict(enumerate(word, 1))

所有这些都表明我不相信你真的需要这个功能。要得到这篇文章中的第二个字母,你可以使用字母[2],而如果它只是一个字符串值,它可以被类似于一个列表来处理,所以关键字[1]将是相同的结果,或者只使用关键字[i+1]如果必须让第一个索引从1开始。

它会覆盖变量,因为您在循环中将它重新定义为一个空白字典,然后只在其中放入一个值。把那两条线移到环外,它就固定了。另外,您不需要使用这些局部变量,只需使用enumerate即可

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'}
请注意,我并不完全原谅这一点,因为这样做是非常不传统的。为什么不直接返回字典并在调用它时将结果分配给一个变量,那么现在它在这个上下文中是一个全局值呢。此外,一个简单的听写理解也能完全理解你想要做的事情:

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

letters = getLetters(keyword)
编辑或如@furas所说,只需使用:

return dict(enumerate(word, 1))

所有这些都表明我不相信你真的需要这个功能。要获得这篇文章中的第二个字母,您需要使用字母[2],而如果它只是一个字符串值,则可以类似于列表来处理,因此关键字[1]将是相同的结果,或者如果您必须将第一个索引从1开始,则只需使用关键字[i+1]。

那么,getLetters的预期结果是什么?由于.copy as strings没有copy方法,它也会出错。不要在for循环中创建字典字母={},因为在每个循环中都会销毁以前的内容,并且只有最后一个值。在for-loop之前创建字母={}。那么getLetters的预期结果是什么呢?由于.copy as strings没有copy方法,它也会出错。不要在for循环中创建字典字母={},因为在每个循环中都会销毁以前的内容,并且只有最后一个值。在for-loop之前创建字母={},甚至返回单词,1哦,天哪,谢谢你,我刚刚意识到你是对的,我每次都在重置字典。谢谢你抽出时间来帮助我克服困惑。没问题如果这回答了你的问题,请用答案左边的复选标记标记。非常感谢!甚至返回单词,1哦,我的天啊,谢谢你,我刚刚意识到你是对的,我每次都在重新设置字典。谢谢你抽出时间来帮助我克服困惑。没问题如果这回答了你的问题,请用答案左边的复选标记标记。非常感谢!