![](/img/trans.png)
[英]Python says "UnboundLocalError: local variable 'key' referenced before assignment"
[英]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.