2013-05-30 73 views
1

如果将变量'key'返回到解密函数中,为什么它不被识别?错误读取 “NameError:全局名称的 '钥匙' 没有定义” 这里是代码:为什么我的Python代码得到“未定义”错误?

alphabet = 'abcdefghijklmnopqrstuvwxyz' 
alphaList = list(alphabet) 
text = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj" 

def createKey(aList): 
    key = [] 
    count = 0 
    for letter in aList: 
     if count < 24: 
      key.append(aList[count + 2]) 
     else: 
      key.append(aList[count - 24]) 
     count += 1 
    return key 

def decrypt(text): 
    createKey(alphaList) 
    decryptedList = [] 
    textList = list(text) 
    for c in textList: 
     if c in alphaList: 
      index = alphaList.index(c)  
      decryptedList.append(key[index])  
     else: 
      decryptedList.append(c) 
    decryptedText = "".join(decryptedList) 
    return decryptedText 

print decrypt(text) 
+2

您的createKey函数返回密钥,但'decrypt()'不会捕获该返回值,例如'key = createKey(alphaList)'。 –

+0

@MarcB听起来像是对我的回答。 – melwil

回答

2

你永远不分配key

createKey(alphaList) 

更改为:

key = createKey(alphaList) 

发生这种情况是因为createKey(alphaList)中的keycreateKey名称范围的一部分。尽管您将其返回,但不会将其作为名称范围的一部分创建。

或者,您可以使用全局变量,但我不建议这样做,特别是因为有一个简单的通过指定keydecrypt()得到解决:

alphabet = 'abcdefghijklmnopqrstuvwxyz' 
alphaList = list(alphabet) 
text = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj" 
key = [] 

def createKey(aList): 
    global key 
    # everything else 
    # no need to return, the `global key` has been changed 

def decrypt(text): 
    global key 
    createKey(alphaList) 
    # everything else 

参考文献:

+0

谢谢。但为什么我需要分配钥匙?被调用时原始函数不应该返回键吗? – uncleGe

+0

@uncleGe您可能想要了解名称范围(我将编辑并添加一个链接到我的答案)。虽然它返回'key',但key是本地函数。你可以创建一个全球化的,但是这是令人不悦的。 –

+0

好的,我现在明白了,我查看了范围链接。谢谢! – uncleGe

相关问题