繁体   English   中英

UnboundLocalError:赋值之前引用了局部变量“ key”

[英]UnboundLocalError: local variable 'key' referenced before assignment

我正在尝试导入文本文件并通过两个关键字进行加密/解密。 我设置了一个关键变量,但是找不到正确的位置来定位它。

现在是这里:

def importFile():
     importText = []
     file = input('What is the text file name: ')
     fileName = open(file,'r')
     text = fileName.read()
     fileName.close()
     fileName = text
     message = text
     #print (text)
     delete = open(file,'w')
     delete.write('')
     key = input ('What key do you wnat to use: ')

这是调用key地方:

def translatedMessage(mode):
    translated = []
    keyIndex = 0
    key = key.upper()

    for symbol in message: 
        num =LETTERS .find(symbol.upper())
        if num != -1: 
            if mode == 'encrypt':
                num += LETTERS .find(key[keyIndex]) 
            elif mode == 'decrypt':
                num -= LETTERS .find(key[keyIndex])

            num %= len(LETTERS)

            if symbol.isupper():
                translated.append(LETTERS[num])
            elif symbol.islower():
                translated.append(LETTERS[num].lower())

            keyIndex += 1 
            if keyIndex == len(key):
                keyIndex = 0
        else:
            translated.append(symbol)
    return ''.join(translated)
if __name__ == '__main__':
    main()

如果您需要它,这里就是全部:

LETTERS = 'ZABCDEFGHIJKLMNOPQRSTUVWXY'
def main():
    myMode = input("Encrypt 'e' or Decrypt 'd': ")
    if myMode == 'encrypt' or myMode == 'e':
        translated = encryptFile()
    elif myMode == 'decrypt' or myMode == 'd':
        translated = decryptFile()

def importFile():
     importText = []
     file = input('What is the text file name: ')
     fileName = open(file,'r')
     text = fileName.read()
     fileName.close()
     fileName = text
     message = text
     #print (text)
     delete = open(file,'w')
     delete.write('')
     key = input ('What key do you wnat to use: ')

def encryptFile():
    textFile = input("Would you like to import a text file 'Y' or 'N': ")
    if textFile.lower() == 'y' :
        importFile()

    return translatedMessage('encrypt')

def decryptFile():
    textFile = input("Would you like to import a text file 'Y' or 'N': ")
    if textFile.lower() == 'y' :
        importFile()

    return translatedMessage('decrypt')

def translatedMessage(mode):
    translated = []
    keyIndex = 0
    key = key.upper()

    for symbol in message: 
        num =LETTERS .find(symbol.upper())
        if num != -1: 
            if mode == 'encrypt':
                num += LETTERS .find(key[keyIndex]) 
            elif mode == 'decrypt':
                num -= LETTERS .find(key[keyIndex])

            num %= len(LETTERS)

            if symbol.isupper():
                translated.append(LETTERS[num])
            elif symbol.islower():
                translated.append(LETTERS[num].lower())

            keyIndex += 1 
            if keyIndex == len(key):
                keyIndex = 0
        else:
            translated.append(symbol)
    return ''.join(translated)
if __name__ == '__main__':
    main()

我对编码非常陌生,并且知道这很简单,因此任何建议都将不胜感激:)

代码中的问题是您将key像全局变量一样对待,但是它是局部变量,因此您需要在函数之间传递它:

LETTERS = 'ZABCDEFGHIJKLMNOPQRSTUVWXY'
def main():
    myMode = input("Encrypt 'e' or Decrypt 'd': ")
    if myMode == 'encrypt' or myMode == 'e':
        translated = encryptFile()
    elif myMode == 'decrypt' or myMode == 'd':
        translated = decryptFile()

def importFile():
     importText = []
     file = input('What is the text file name: ')
     fileName = open(file,'r')
     text = fileName.read()
     fileName.close()
     fileName = text
     message = text
     #print (text)
     delete = open(file,'w')
     delete.write('')
     return input ('What key do you wnat to use: ')  # Return the key

def encryptFile():
    textFile = input("Would you like to import a text file 'Y' or 'N': ")
    if textFile.lower() == 'y' :
        key = importFile()  # Get the key returned by the function

    return translatedMessage('encrypt', key)  # Pass the key to the function

def decryptFile():
    textFile = input("Would you like to import a text file 'Y' or 'N': ")
    if textFile.lower() == 'y' :
        key = importFile()  # Get the key returned by the function

    return translatedMessage('decrypt', key)  # Pass the key to the function

def translatedMessage(mode, key):  # `key` is an argument
    translated = []
    keyIndex = 0
    key = key.upper()

    for symbol in message: 
        num =LETTERS .find(symbol.upper())
        if num != -1: 
            if mode == 'encrypt':
                num += LETTERS .find(key[keyIndex]) 
            elif mode == 'decrypt':
                num -= LETTERS .find(key[keyIndex])

            num %= len(LETTERS)

            if symbol.isupper():
                translated.append(LETTERS[num])
            elif symbol.islower():
                translated.append(LETTERS[num].lower())

            keyIndex += 1 
            if keyIndex == len(key):
                keyIndex = 0
        else:
            translated.append(symbol)
    return ''.join(translated)
if __name__ == '__main__':
    main()

一个简单的解决方案是通过将行global key添加到importFile()函数来将key定义为全局变量。 但是,总的来说,我认为不建议在Python中使用global关键字。

Python中的全局变量与局部变量的这种解释可能会有所帮助: http : //www.python-course.eu/global_vs_local_variables.php

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM