2013-05-30 3 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) 

Это происходит потому, что key в createKey(alphaList) является частью прозвища createKey. Хотя вы его возвращаете, вы не создаете это как часть осколка decrypt.

В качестве альтернативы, вы можете использовать глобальные переменные, но я не рекомендую это, особенно потому, что это легко обойти путем присвоения key в decrypt():

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 Возможно, вы захотите ознакомиться с областями имен (я отредактирую и добавлю ссылку на мой ответ). Хотя он возвращает «ключ», ключ является локальным для этой функции. Вы могли бы создать глобальный, но это нахмурилось. –

+0

Хорошо, я получил его сейчас, и я проверяю ссылку на области. Благодаря! – uncleGe

Смежные вопросы