鱼C论坛

 找回密码
 立即注册
查看: 2414|回复: 22

[已解决]关于判读字符串相等的实现方式

[复制链接]
发表于 2021-2-8 10:20:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
python中判断两个字符串相等 比如 python==cplus 是先判断两个字符串的长度然后再一个个字母的比较还是直接对每一个字母进行比较?
最佳答案
2021-2-8 22:42:12
会飞的猪. 发表于 2021-2-8 22:33
如果每次都直接比较字符串的话会不会比较浪费速度,
如果先取长度的话,会快一点。

当然不会,因为我们所认为的直接比较字符串,在 Python 的语言设计中已经有过 字符串长度的比较预处理了,就好像一个工厂生产 A4 纸 ,人家的切割机已经调好了,将一张 A3 以什么样的比例大小切割成 2 张 A4,而你却在担心机器直接切割浪费时间以及精准度 非要在 A3 纸上自己划线让机器按照划线切割 ,你说这不是多此一举么? 你的方法反而浪费了机器的内存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-8 10:24:41 | 显示全部楼层
??为什么要关心这个呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 11:23:22 | 显示全部楼层
按照我个人的观点,是按照这样一个顺序判断的(只是我自己的想法)

1.判断 id 如果 id 指向相同则表示相等,如果不同进行下一步判断
2.判断字符串长度,如果字符串长度不同则表示不相等,如果相同进行下一步判断
3.按字符顺序按位比较,我们知道字符串同样能比较大小  例如  "z" > "a" 所以应当是有比较是否相等的过程

我这么认为因为这是我们公众的思维最快速的判断方式,但是不是确实如此还真的不知道。因为这个确实没什么太大意义,想必没什么人深究吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-2-8 12:29:43 | 显示全部楼层
这个你得去看源码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 12:30:55 | 显示全部楼层
qq1151985918 发表于 2021-2-8 11:23
按照我个人的观点,是按照这样一个顺序判断的(只是我自己的想法)

1.判断 id 如果 id 指向相同则表示相 ...


两个变量的值是一样的字符串的话, id 有可能不相同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 12:43:27 | 显示全部楼层
°蓝鲤歌蓝 发表于 2021-2-8 12:30
两个变量的值是一样的字符串的话, id 有可能不相同

是啊 我说的也是这个啊  id 相同表示相同  ,id 不同 再进一步判断...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 12:55:19 | 显示全部楼层
qq1151985918 发表于 2021-2-8 12:43
是啊 我说的也是这个啊  id 相同表示相同  ,id 不同 再进一步判断...

我的意思是,你用 id 判两个字符串相等 很奇怪,因为会出现 值相同而地址不相同,判字符传相等都是考虑 值相等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 13:18:28 | 显示全部楼层
°蓝鲤歌蓝 发表于 2021-2-8 12:55
我的意思是,你用 id 判两个字符串相等 很奇怪,因为会出现 值相同而地址不相同,判字符传相等都是考虑  ...

确实是有这种情况,而且这种情况居多,但是我认为 id 相同说明指向的是同一个对象,所以我认为 判断 id 排第一位,如果 id 不同当然也不能说明 字符串的值 不相等,所以才需要下一步判断 其实我的意思  用代码就是
def isEqual(x,y):
    if x is y :
        print("id 相同")
        return True
    elif len(x) != len(y):
        print("长度不同")
        return False
    else:
        for i in range(len(x)):
            if x[i] != y[i]:
                print("值不相同")
                return False
        else:
            print("值相同")
            return True

"""
>>> 
>>> isEqual("aa","aa")
id 相同
True
>>> isEqual("aa","abc")
长度不同
False
>>> isEqual("aa","ab")
值不相同
False
>>> isEqual("aa"," aa ".strip())
值相同
True
>>>
"""

当然这已经是画蛇添足,我们本就是在用着现成的,我只是想表达我的意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 13:25:07 From FishC Mobile | 显示全部楼层
°蓝鲤歌蓝 发表于 2021-2-8 12:55
我的意思是,你用 id 判两个字符串相等 很奇怪,因为会出现 值相同而地址不相同,判字符传相等都是考虑  ...

你说的和他说的并不冲突啊,为啥你俩会讨论这么多层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 13:28:05 | 显示全部楼层
本帖最后由 qq1151985918 于 2021-2-8 13:29 编辑
hrp 发表于 2021-2-8 13:25
你说的和他说的并不冲突啊,为啥你俩会讨论这么多层


还是有点区别的,他可能是认为 优先判断 字符串的值  而我认为优先判断 id,当然可能都不正确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 13:58:36 | 显示全部楼层
qq1151985918 发表于 2021-2-8 13:28
还是有点区别的,他可能是认为 优先判断 字符串的值  而我认为优先判断 id,当然可能都不正确

其实是我以为你说的是 判字符串 用 id,原来你是说的是 源码实现的猜想。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 14:05:05 | 显示全部楼层
qq1151985918 发表于 2021-2-8 13:28
还是有点区别的,他可能是认为 优先判断 字符串的值  而我认为优先判断 id,当然可能都不正确

我刚才看了源代码,先判断地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-2-8 14:35:51 From FishC Mobile | 显示全部楼层
永恒的蓝色梦想 发表于 2021-2-8 14:05
我刚才看了源代码,先判断地址


还是导师厉害,不过导师既然看了源码怎么不直接给楼主解释下这个问题,也省的我们猜来猜去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 14:50:16 | 显示全部楼层
qq1151985918 发表于 2021-2-8 14:35
还是导师厉害,不过导师既然看了源码怎么不直接给楼主解释下这个问题,也省的我们猜来猜去

我只看明白了先判断地址(就是ID),然后剩下的部分有乱七八糟的调用,我这里没正经的开发环境,就没看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 15:45:23 | 显示全部楼层
去了解一下python字符串驻留机制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-8 22:31:34 | 显示全部楼层
qiuyouzhi 发表于 2021-2-8 10:24
??为什么要关心这个呢

我做作业的时候突发奇想
secret=('1234')
count=3
lens=len(secret)
while(count>0):
    guess=input('请输入密码*****')
    leng=len(guess)
    count-=1
    if (lens==leng) and (guess==secret):
        print('密码正确,进入程序....')
        break
    else:
        print('密码错误,您还有%d次机会'%count)
如果每次都直接比较字符串的话会不会比较浪费速度,
如果先取长度的话,会快一点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-8 22:33:52 | 显示全部楼层
qq1151985918 发表于 2021-2-8 11:23
按照我个人的观点,是按照这样一个顺序判断的(只是我自己的想法)

1.判断 id 如果 id 指向相同则表示相 ...
secret=('1234')
count=3
lens=len(secret)
while(count>0):
    guess=input('请输入密码*****')
    leng=len(guess)
    count-=1
    if (lens==leng) and (guess==secret):
        print('密码正确,进入程序....')
        break
    else:
        print('密码错误,您还有%d次机会'%count)
如果每次都直接比较字符串的话会不会比较浪费速度,
如果先取长度的话,会快一点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 22:42:12 | 显示全部楼层    本楼为最佳答案   
会飞的猪. 发表于 2021-2-8 22:33
如果每次都直接比较字符串的话会不会比较浪费速度,
如果先取长度的话,会快一点。

当然不会,因为我们所认为的直接比较字符串,在 Python 的语言设计中已经有过 字符串长度的比较预处理了,就好像一个工厂生产 A4 纸 ,人家的切割机已经调好了,将一张 A3 以什么样的比例大小切割成 2 张 A4,而你却在担心机器直接切割浪费时间以及精准度 非要在 A3 纸上自己划线让机器按照划线切割 ,你说这不是多此一举么? 你的方法反而浪费了机器的内存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 22:57:39 | 显示全部楼层
qiuyouzhi 发表于 2021-2-8 22:51
如果长度不同的话,这样还会更加浪费速度。

如果长度相同会浪费一些速度,长度不同应该不会,因为长度不同直接就 False 了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-2-8 23:30:51 | 显示全部楼层
qq1151985918 发表于 2021-2-8 22:42
当然不会,因为我们所认为的直接比较字符串,在 Python 的语言设计中已经有过 字符串长度的比较预处理了 ...

是不是可以理解为python中关于字符串长度的比较已经有了最优的算法,我这样去要求反而画蛇添足了?进行了重复的计算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 09:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表