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
的最干净的起点。
我似乎找不到我的错误。我正在尝试编写一个简单的程序,使用 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
的最干净的起点。