1

所以我在python中有以下代码块,它基本上打开一个文本文件,从文件的文本内容中创建一个数组(逐行拆分),然后继续从用户那里获取输入并将该输入与每个数组中的术语。尽管用户提交的字符串在数组中,与输入的完全相同,但程序无法判断这两个字符串是否相等。如何比较字符串?如果这个符号是正确的,那么不平等的原因可能是什么?我尝试用“is”代替“==”,但这也不起作用。

userinputisfrogeyedpeasUserArray[0]is的输入frogeyedpeas

文件用户名.txt

frogeyedpeas
vsauce

(在 vsauce 之后还有一个完全空白的附加行)

代码贴在下面:

Usernames = open('Usernames.txt', 'r+')
UserArray = Usernames.read().split("\n")

userinput = raw_input("Enter Username: ")
passinput = raw_input("Enter Password: ")
i = 0
q = len(UserArray)
while(i < q):
    founduser = 0
    print userinput, UserArray[i], UserArray #out

    if(UserArray[i] == userinput):
        founduser = 1
        if(PassArray[i] == passinput):
            userstatus = i
            founduser = 2
    i = i + 1
4

5 回答 5

4

您正在测试对象身份:

UserArray[i] is userinput:

你真的想用平等代替:

UserArray[i] == userinput:

is测试两个对象引用是否指向同一个对象。==测试两个对象的值是否相等。

具有相同内容(相等)的两个字符串不一定是同一个对象:

>>> spam = 'foo bar baz'
>>> ham = 'foo bar baz'
>>> spam is ham
False
>>> spam == ham
True
>>> eggs = ham
>>> eggs is ham
True

CPython 确实使用了一些技巧来节省内存和提高性能,其中小整数和一些字符串被保留;每次你尝试创建一个新的字符串或整数,而不是一个新的对象,你都会得到一个已经缓存的值。在这些情况下,is测试返回True 只是因为您确实拥有相同的对象,解释器为您重用。

请注意,相等性测试仍然可能不正确。值周围可能有额外的空格,或者其他在打印到屏幕时不会立即明显的字符:

>>> val1 = 'frogeyedpeas'
>>> val2 = 'frogeyedpeas\t'
>>> val1 == val2
False
>>> print val1, val2
frogeyedpeas frogeyedpeas
>>> print repr(val1), repr(val2)
'frogeyedpeas' 'frogeyedpeas\t'
于 2013-10-15T18:03:24.930 回答
3

尝试:

UserArray[i].strip(' \n') == userinput.strip(' \n')

由于您的输入法不同,并且您可能在一个而不是另一个中有尾随空格和/或换行符。

于 2013-10-15T18:10:38.400 回答
2

那么,如果 founduser 等于 1,您是否试图跳出循环以测试它是否有效?每次在 while 循环中运行代码时,该代码块都会发现用户重置。也许说 while(i < q and founduser != 1) 作为循环头?

于 2013-10-15T18:08:44.167 回答
1

这应该足够了:

#What to look for.
x=raw_input("Test for: ")

#Read and split list.
f=open('usernames.txt','r')
y=f.read()
y=y.split(',')
f.close()

#Test if the input is in list.
#If it is, tell what the match is.
for user in y:
    if str(x)==str(user):
        print x+'='+user

'username.txt' 的格式如下:

酱汁,冷冻豌豆

让我知道事情的后续。

于 2013-10-15T18:10:59.983 回答
1

复制代码后,创建一个带有单词“frogeyedpeas”的新文本文件,并使用==代替is,代码似乎确实有效。要清理它,您可能需要使用for循环并将两个数组压缩在一起,如下所示:

for name, password in zip(UserArray, PassArray):
    print userinput, name, UserArray        

    if name == userinput:
        founduser = 1

    if password == passinput:
        userstatus = UserArray.index(name)
        founduser = 2
于 2013-10-15T18:16:12.077 回答