Python 假连接错误?

Python False Concatenate Error?

我似乎找不到我的错误。我正在尝试编写一个简单的程序,使用 caesar shift 方法加密消息。但是,我遇到了一个奇怪的错误。程序如下:

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 之后,命令行将 return

{'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。我确定这是我的代码中的一个疏忽,但我这辈子都找不到它。

你可能预料到了

code = alphabet

alphabet 字典复制到 code。事实并非如此。此行计算 alphabet 变量,生成对字典的引用,然后使 code 引用同一个字典。 code的设置项也会改变alphabet,因为这两个变量都是同一个字典的名称。特别是

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

alphabet的所有值都是字符串。

如果你想要一份,你可以复制一份:

code = alphabet.copy()

虽然 alphabet 的副本可能不是构建 code 的最干净的起点。