2015-03-16 3 views
0

Я не могу найти свою ошибку. Я пытаюсь написать простую программу, которая шифрует сообщения, используя метод цезарного сдвига. Тем не менее, я получаю фанк-ошибку. Программа выглядит следующим образом:Ошибка ложной конкатенации Python?

alphabet = {"a":0,"b":1,"c":2,"d":3,"e":4,"f":5,"g":6,"h":7,"i":8,"j":9,"k":10,"l":11,"m":12,"n":13,"o":14,"p":15,"q":16,"r":17,"s":18,"t":19,"u":20,"v":21,"w":22,"x":23,"y":24,"z":25} 

alpha2 = dict (zip(alphabet.values(),alphabet.keys())) 

def key(n): 
    code = alphabet 

    for i in code: 
     code[i] = (code[i] + n) % 26 

    for i in code: 
     code[i] = alpha2[code[i]] 

    return code 

def encode(x,n): 

    my_key = key(n) 
    message = [] 
    for i in x: 
     message.append(my_key[i]) 

print key(13) 
print encode("Message",13) 

Я считаю это абсурд, потому что после того, как работает мой ./caesars.py командной строки вернет

{'a': 'n', 'c': 'p', 'b': 'o', 'e': 'r', 'd': 'q', 'g': 't', 'f': 's', 'i': 'v', 'h': 'u', 'k': 'x', 'j': 'w', 'm': 'z', 'l': 'y', 'o': 'b', 'n': 'a', 'q': 'd', 'p': 'c', 's': 'f', 'r': 'e', 'u': 'h', 't': 'g', 'w': 'j', 'v': 'i', 'y': 'l', 'x': 'k', 'z': 'm'} 
Traceback (most recent call last): 
    File "./caesars.py", line 56, in <module> 
    print encode("Message",13) 
    File "./caesars.py", line 27, in encode 
    my_key = key(n) 
    File "./caesars.py", line 15, in key 
    code[i] = (code[i] + n) % 26 
TypeError: cannot concatenate 'str' and 'int' objects 

Что ясно означает, что первый запуск через функцию key был успешным, но когда функции encode пытаются вызвать функцию key во второй раз, когда она решает проблемы? Я напечатал типы n, и они выходят как int. Я уверен, что это надзор в моем коде, но для жизни меня я не могу найти.

+0

'code = alphabet' не делает то, что вы думаете. – user2357112

+0

Не могли бы вы ласково разработать? – WhiteMask

+0

Вы должны использовать 'code = alphabet.copy()' – rhaps0dy

ответ

2

Вы, наверное, ожидали

code = alphabet 

скопировать alphabet Dict в code. Это не то, что происходит. Эта строка оценивает переменную alphabet, производя ссылку на dict, а затем делает code ссылкой на тот же самый dict. Элементы настройки code также изменят alphabet, поскольку обе переменные являются именами одного и того же dict. В частности, после

for i in code: 
    code[i] = alpha2[code[i]] 

все значения alphabet являются строками.

Если вы хотите получить копию, вы можете сделать копию:

code = alphabet.copy() 

хотя копия alphabet не может быть чистейшая отправной точкой для построения code.

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