我似乎无法找到我的错误。我试图编写一个使用凯撒移位方法加密消息的简单程序。但是,我得到了一个时髦的错误。计划如下:
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 :(得分: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
的最简洁的起点。