【问题标题】:Why does my Python code get an "not defined" error?为什么我的 Python 代码会出现“未定义”错误?
【发布时间】:2013-05-30 19:01:49
【问题描述】:

如果将变量'key'返回到解密函数中,为什么无法识别?错误显示“NameError:未定义全局名称'key'”这是代码:

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)

【问题讨论】:

  • 您的 createKey 函数会返回密钥,但 decrypt() 不会捕获该返回值,例如key = createKey(alphaList).
  • @MarcB 听起来像是对我的回答。

标签: python nameerror


【解决方案1】:

你永远不会分配key

createKey(alphaList)

将其更改为:

key = createKey(alphaList)

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

或者,您可以使用全局变量,但我不建议这样做,尤其是因为在decrypt() 中分配key 很容易:

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

参考资料:

【讨论】:

  • 谢谢。但是为什么我需要分配密钥?原函数调用时不应该返回键吗?
  • @uncleGe 您可能想阅读名称范围(我将编辑并添加指向我的答案的链接)。尽管它返回 key,但 key 是该函数的本地函数。你可以创建一个全局变量,但这是不受欢迎的。
  • 好的,我现在知道了,我查看了范围链接。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
相关资源
最近更新 更多