Python的结果与整数和字符串列表不同

时间:2018-11-06 03:35:16

标签: python

当我偶然发现一个错误时,我正在尝试创建一个反向栅栏密码! 这是我的代码:

n=len(cipher)
strings=[]
for r in range(3,4):
    lis=[[0 for i in range(n)] for i in range(r)]
    x,y=0,0
    for c in cipher:
        try:
            lis[x][y]=c
        except:
            for i in lis:
                print(i)
            print(x,y)
            break
        y+=2*r-3
        print(y)
        if y>=n:
            y-=n
            x+=1
            print(x,y)
    x,y,z=0,0,1
    s=""
    for i in range(n):
        try:
            if(lis[x][y]==0):
                print(r,n)
            s+=lis[x][y]
        except:
            for i in lis:
                print(i)
            print(x,y,c)
            break
        y+=1
        if x==0:
            z=1
        elif x==r-1:
            z=0
        if z==1:
            x+=1
        else:
            x-=1
    strings.append(s)
return strings

我添加了一些try / except语句来确定错误。不过,后来发现,如果我将一行4更改为一行,则读为

lis=[['.' for i in range(n)] for i in range(r)]

代码可以完美地工作(因为没有产生任何错误-它仍然没有产生正确的结果)!

代码之间的唯一区别是这一行。我在Windows 10上使用的是Python 37。

为什么一个代码在其他代码不起作用的地方起作用?

编辑:我的输入密码是“ Js s!ae saeoemiwm”,它是使用围栏密码中的三个“ rails”编码的。

编辑2:我有一个可以逆转此密码的工作版本,但是这个问题的重点是为什么将0更改为'。有什么不同吗?

1 个答案:

答案 0 :(得分:0)

原因是这一行:

s+=lis[x][y]

s是一个字符串,因此只能将其他字符串连接到该字符串。如果lis[x][y]包含0,则该数字是数字,而不是字符串,因此您无法将其连接起来。

如果将其更改为:

s += str(lis[x][y])

然后它将使用任何一个初始值。