所以我在python中有以下代码块,它基本上打开一个文本文件,从文件的文本内容中生成一个数组(逐行拆分),然后继续从用户那里获取输入并将该输入与数组中的每个术语。尽管用户提交的字符串在数组中,与输入的完全相同,但程序无法判断两个字符串是否相等。我如何比较字符串?如果这种表示法是正确的,那可能是造成不平等的原因?我尝试用“is”代替“==”,但这也不起作用。
userinput
的输入为frogeyedpeas
,UserArray[0]
的输入为frogeyedpeas
文件Usernames.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
答案 0 :(得分:3)
您正在测试对象标识:
UserArray[i] is userinput:
你真的想要使用 equality :
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确实使用一些技巧来节省内存并提高性能,其中小整数和一些字符串 interned ;每次尝试创建一个新的字符串或整数,而不是一个新对象,您将获得一个已缓存的值。在这些情况下,is
测试仅返回True
,因为您确实拥有相同的对象,并由解释器重复使用。
请注意,相等测试仍可能不正确。值可能会有额外的空格,或者在打印到屏幕时不会立即明显的其他字符:
>>> val1 = 'frogeyedpeas'
>>> val2 = 'frogeyedpeas\t'
>>> val1 == val2
False
>>> print val1, val2
frogeyedpeas frogeyedpeas
>>> print repr(val1), repr(val2)
'frogeyedpeas' 'frogeyedpeas\t'
答案 1 :(得分:3)
尝试:
UserArray[i].strip(' \n') == userinput.strip(' \n')
由于您的输入方法不同,您可能在一个而不是另一个中有尾随空格和/或换行符。
答案 2 :(得分:1)
好吧,如果finduser等于1,你是否试图突破循环以测试它是否有效?每次代码都在while循环中运行代码时发现用户重置。也许说while(i&lt; q和founduser!= 1)作为循环标题?
答案 3 :(得分: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'的格式如下:
Vsauce的,frogeyedpeas
让我知道它是怎么回事。
答案 4 :(得分: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