Python 将 false 返回到 "1"=="1"。任何想法为啥?

Posted

技术标签:

【中文标题】Python 将 false 返回到 "1"=="1"。任何想法为啥?【英文标题】:Python is returning false to "1"=="1". Any ideas why?Python 将 false 返回到 "1"=="1"。任何想法为什么? 【发布时间】:2015-09-04 13:05:58 【问题描述】:

我为我的 A Level 计算任务编写了一个侦察系统。该程序旨在存储有关侦察兵小屋的侦察兵信息,包括徽章、排行榜系统和用于从列表中添加/查找/删除侦察兵的管理系统。侦察信息必须存储在文件中。

删除功能的文件处理过程(我的问题所在): 删除侦察按钮触发一个弹出窗口(使用 tkinter)。该窗口收集球探的 ID,然后搜索球探文件,扫描存储的球探 ID 并将其与输入的 ID 进行比较。如果找到了 ID,它会跳过文件的这一行,否则将该行复制到临时文件中。完成所有行后,将 temp 中的行复制到原始文件的新空白版本,并将临时文件删除/重新创建为空白。

我的问题: 问题是当程序将要删除的 ID (remID) 与文件中当前正在查看的侦察员的 ID (sctID) 进行比较时,实际上它们相等时它返回 false。这可能是我处理变量、拆分行以获取 ID 甚至我的数据类型的问题。我只是不知道。我尝试将两者都转换为字符串,但仍然是错误的。本节的代码如下。提前谢谢!

elif self._name == "rem":
            remID = str(scoutID.get())
            if remID != "":
                #store all the lines that are in the file in a temp file
                with open(fileName,"r") as f:
                        with open(tempFileName,"a") as ft:
                            lines = f.readlines()
                            for line in lines:
                                sctID = str(line.split(",")[3])
                                print("%s,%s,%s"%(remID, sctID, remID==sctID))
                                #print(remID)
                                if sctID != remID: #if the ID we are looking to remove isn't
                                    #the ID of the scout we are currently looking at, move it to the temp file
                                    ft.write(line)
                #remove the main file, then rectrate a new one
                os.remove(fileName)
                file = open(fileName,"a")
                file.close()

                #copy all the lines back to the main file
                with open(tempFileName,"r") as tf:
                    lines = tf.readlines()
                    with open(fileName,"a") as f:
                        for line in lines:
                            f.write(line)
                #finally, delete and recreate the temp file
                os.remove(tempFileName)
                file = open(tempFileName,"a")
                file.close()
            #remove the window    
            master.destroy()

我的输出:

1,1
,False
1,2
,False
1,3
,False

【问题讨论】:

你没有显示你的输出,但我敢打赌它看起来像id, id<newline>,False,或类似的。使用%r 而不是%s 可以更好地诊断。 如果不告诉我们输入文件的内容,代码 sn-p 并不是很有用,但是 Python 不会为"1" == "1" 返回False,它会返回False 进行任何比较你实际上是在两个不相等的物体之间制作。在print() 调用之前,请尝试print(repr(remID), repr(sctID)),这样您就可以看到正在比较的实际项目。您使用的格式化调用将在视觉上消除类型等差异。 @MartijnPieters 我添加了我得到的输出 额外的换行符没有提示你?你认为它来自哪里? @TigerhawkT3 这是一个公平的观点,我对此有点担心,但我什至不认为这可能是问题的根源。不过现在都修好了,谢谢:) 【参考方案1】:

通过转换为字符串,您可以隐藏错误。

出于调试目的,请始终尝试使用 repr(value) 而不是 str(value)。您还应该知道,最好比较整数而不是字符串——例如" 1" != "1"。

编辑:从您的输出中,很明显您有一个额外的 '\n' (换行符)在 sctID 中。因为你比较字符串,这将是 永远是假的。

我猜,你要么有带有额外空格或其他隐藏字符的字符串,要么只是不同类型的值,这也会引发不同的结果。

【讨论】:

谢谢这解决了我的问题。原来一个字符串是“1/n”,因为行尾前缀【参考方案2】:

这两个值不相同尝试打印出值并查看它们。 sctID 可能有一对[] 围绕字符串以及一些额外的逗号,除非scoutID.get() 返回一个列表。或者你可能只是有一个额外的特殊字符或空格。

【讨论】:

而不是 print("%s,%s,%s"%(remID, sctID, remID==sctID)) 试试 print(remID, sctID, remID==sctID) 看看它会给你什么 你的字符串中也可以有额外的空格或特殊字符,比如换行符

以上是关于Python 将 false 返回到 "1"=="1"。任何想法为啥?的主要内容,如果未能解决你的问题,请参考以下文章

python遍历目录os.walk(''d:\test2",topdown=False)

7. Python运算符之逻辑成员身份运算符及优先级

当 s = "(]" 时,Leetcode 有效括号返回 false?

云计算Python自动化:运算符代码详解

If语句在While True循环(Python)中返回False

python中= 和==的区别