会飞的猪. 发表于 2021-2-8 10:20:32

关于判读字符串相等的实现方式

python中判断两个字符串相等 比如 python==cplus 是先判断两个字符串的长度然后再一个个字母的比较还是直接对每一个字母进行比较?

qiuyouzhi 发表于 2021-2-8 10:24:41

??为什么要关心这个呢

qq1151985918 发表于 2021-2-8 11:23:22

按照我个人的观点,是按照这样一个顺序判断的(只是我自己的想法)

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

我这么认为因为这是我们公众的思维最快速的判断方式,但是不是确实如此还真的不知道。因为这个确实没什么太大意义,想必没什么人深究吧。

°蓝鲤歌蓝 发表于 2021-2-8 12:29:43

这个你得去看源码

°蓝鲤歌蓝 发表于 2021-2-8 12:30:55

qq1151985918 发表于 2021-2-8 11:23
按照我个人的观点,是按照这样一个顺序判断的(只是我自己的想法)

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

两个变量的值是一样的字符串的话, id 有可能不相同

qq1151985918 发表于 2021-2-8 12:43:27

°蓝鲤歌蓝 发表于 2021-2-8 12:30
两个变量的值是一样的字符串的话, id 有可能不相同

是啊 我说的也是这个啊id 相同表示相同,id 不同 再进一步判断...

°蓝鲤歌蓝 发表于 2021-2-8 12:55:19

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

我的意思是,你用 id 判两个字符串相等 很奇怪,因为会出现 值相同而地址不相同,判字符传相等都是考虑 值相等。

qq1151985918 发表于 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 != y:
                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
>>>
"""

当然这已经是画蛇添足,我们本就是在用着现成的,我只是想表达我的意思

hrp 发表于 2021-2-8 13:25:07

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

你说的和他说的并不冲突啊,为啥你俩会讨论这么多层{:10_250:}

qq1151985918 发表于 2021-2-8 13:28:05

本帖最后由 qq1151985918 于 2021-2-8 13:29 编辑

hrp 发表于 2021-2-8 13:25
你说的和他说的并不冲突啊,为啥你俩会讨论这么多层

还是有点区别的,他可能是认为 优先判断 字符串的值而我认为优先判断 id,当然可能都不正确

°蓝鲤歌蓝 发表于 2021-2-8 13:58:36

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

其实是我以为你说的是 判字符串 用 id,原来你是说的是 源码实现的猜想。

永恒的蓝色梦想 发表于 2021-2-8 14:05:05

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

我刚才看了源代码,先判断地址

qq1151985918 发表于 2021-2-8 14:35:51

永恒的蓝色梦想 发表于 2021-2-8 14:05
我刚才看了源代码,先判断地址

还是导师厉害,不过导师既然看了源码怎么不直接给楼主解释下这个问题,也省的我们猜来猜去

永恒的蓝色梦想 发表于 2021-2-8 14:50:16

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

我只看明白了先判断地址(就是ID),然后剩下的部分有乱七八糟的调用,我这里没正经的开发环境,就没看{:10_263:}

YunGuo 发表于 2021-2-8 15:45:23

去了解一下python字符串驻留机制

会飞的猪. 发表于 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)
如果每次都直接比较字符串的话会不会比较浪费速度,
如果先取长度的话,会快一点。

会飞的猪. 发表于 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)
如果每次都直接比较字符串的话会不会比较浪费速度,
如果先取长度的话,会快一点。

qq1151985918 发表于 2021-2-8 22:42:12

会飞的猪. 发表于 2021-2-8 22:33
如果每次都直接比较字符串的话会不会比较浪费速度,
如果先取长度的话,会快一点。

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

qq1151985918 发表于 2021-2-8 22:57:39

qiuyouzhi 发表于 2021-2-8 22:51
如果长度不同的话,这样还会更加浪费速度。

如果长度相同会浪费一些速度,长度不同应该不会,因为长度不同直接就 False 了

会飞的猪. 发表于 2021-2-8 23:30:51

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

是不是可以理解为python中关于字符串长度的比较已经有了最优的算法,我这样去要求反而画蛇添足了?进行了重复的计算
页: [1] 2
查看完整版本: 关于判读字符串相等的实现方式