鱼C论坛

 找回密码
 立即注册
查看: 115|回复: 13

小甲鱼作业:子字符串和父字符串(大佬帮忙看一下)

[复制链接]
发表于 2022-6-23 22:38:28 | 显示全部楼层 |阅读模式

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

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

x
Z=input("请输入子字符串:")  #输入abc
F=input("请输入父字符串:")  #输入abcde
j=""
for i in F:
    if i in Z:
        j+=i
if j is Z:#这里是’is‘就不会打印,换成’==‘就可以了
    print(f"{Z}为{F}的子字符串")
        
#不知道为什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-6-23 22:47:34 | 显示全部楼层

回帖奖励 +10 鱼币

is 关键字用于测试两个变量是否引用同一对象
== 比较对象是否相等
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-6-23 22:51:15 From FishC Mobile | 显示全部楼层
==才是判断两个变量是否相等
is是判断两个变量是否指向一个地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2022-6-23 22:58:50 | 显示全部楼层
傻眼貓咪 发表于 2022-6-23 22:47
is 关键字用于测试两个变量是否引用同一对象。
== 比较对象是否相等

我用is判断是否为同一对象,j is Z应当返回True啊(此时j和Z都是"abc"),所以最终应当打印出来才对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-6-23 23:04:03 | 显示全部楼层
hello? 发表于 2022-6-23 22:58
我用is判断是否为同一对象,j is Z应当返回True啊(此时j和Z都是"abc"),所以最终应当打印出来才对{:10_ ...

我测试没有问题啊?
  1. print("apple" is "oren")
  2. print("apple" is "apple")
复制代码
  1. False
  2. True
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-6-23 23:06:02 From FishC Mobile | 显示全部楼层
傻眼貓咪 发表于 2022-6-23 23:04
我测试没有问题啊?

带空格的字符串就完蛋了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-6-23 23:11:12 | 显示全部楼层
wp231957 发表于 2022-6-23 23:06
带空格的字符串就完蛋了


其实不用带空格,这本来就是错的。我在上面已经说了。

乌龟是动物,小鸟是动物,乌龟是小鸟?


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-6-23 23:28:35 | 显示全部楼层
本帖最后由 白two 于 2022-6-23 23:30 编辑

python 有驻留机制,
不符合驻留机制的时候, 即使两个字符串相等, 也是两个不同的对象
驻留机制并不是对所有的数字,字符串,它只对“  [0-9] [a-z] [A-Z]和"_"(下划线)  ”有效,当字符串中由其他字符比如“! @ # ¥ % -”时字符驻留机制是不起作用的

  • 字符串长度为0或1时,默认采用驻留机制;
  • 字符串长度大于1时,且 字符串中只包含大小写字母、数字、下划线(_) 时,采用驻留机制;
  • 对于 [-5,256]之间的整数数字,Python默认驻留 ;
  • 字符串 只在编译时进行驻留,而非运行时 。Python是解释型语言,但是事实上,它的解释器也可以是理解为是一种编译器,它负责将Python代码翻译成字节码,也就是.pyc文件;
  • 用乘法得到的字符串,如果结果长度 <=20且字符串只包含数字、字母大小写、下划线,支持驻留。长度>20,不支持驻留。这样的设计目的是为了保护.pcy文件不会被错误代码搞的过大。


例如:
  1. >>> a = 'aabb@#'
  2. >>> b = 'aabb@#'
  3. >>> a is b
  4. False
复制代码
  1. >>> a = 'abc'
  2. >>> b = 'abc'
  3. >>> a is b
  4. True
复制代码

  1. >>> a = 'abcd'
  2. >>> b = 'abc'
  3. >>> id(a[0])
  4. 2881267427440
  5. >>> id(b[0])
  6. 2881267427440
  7. >>> a[0] is b[0]
  8. True
复制代码

但是如果:
  1. >>> id(a[0:2])
  2. 2881301834288
  3. >>> id(b[0:2])
  4. 2881302064944
  5. >>> a[0:2] is b[0:2]
  6. False
复制代码

因为这里是两个新的对象

并且python中的驻留发生在compile_time,而不是run_time
  1. >>> str1='sten'+'waves'  # compile_time
  2. >>> str1 is 'stenwaves'
  3. True

  4. >>> str3='sten'
  5. >>> str4=str3+'waves'
  6. >>> str4 is 'stenwaves'  # run_time
  7. False
复制代码


你的这个虽然最后结果相等, 但是是在运行的时候才会出来, 所以并不会采用驻留机制, 也就会导致两个字符串虽然相等, 但是是两个不同的对象, 占用了不同的内存
并且因为你是单个单个加的, 所以也会创建新的对象
  1. >>> a = 'abc'
  2. >>> j = ''
  3. >>> j += 'a'
  4. >>> j += 'b'
  5. >>> j += 'c'
  6. >>> j is a
  7. False

  8. >>> j = ''
  9. >>> j += 'abc'
  10. >>> j is a
  11. True
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-6-23 23:35:27 From FishC Mobile | 显示全部楼层
白two 发表于 2022-6-23 23:28
python 有驻留机制,
不符合驻留机制的时候, 即使两个字符串相等, 也是两个不同的对象
驻留机制并不是对所 ...

已经改了

对于 [-5,256]之间的整数数字,Python默认驻留 已经无效

可以试试:
  1. print(id(3000), id(3000))
  2. print(id(-12345), id(-12345))
  3. print(456789 is 456789)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-6-23 23:42:52 From FishC Mobile | 显示全部楼层
傻眼貓咪 发表于 2022-6-23 23:35
已经改了

对于 [-5,256]之间的整数数字,Python默认驻留 已经无效

什么版本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-6-23 23:53:03 From FishC Mobile | 显示全部楼层
hrpzcf 发表于 2022-6-23 23:42
什么版本

抱歉了,我好像误解了,因为非常好奇为什么会改,所以上网爬文,经过测试好像必须转成字符串,再转回整型,才能真正测出来。
  1. for num in range(300):
  2.         a = int(str(num))
  3.         b = int(str(num))
  4.         print(num, a is b)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-6-23 23:53:54 From FishC Mobile | 显示全部楼层
白two 发表于 2022-6-23 23:28
python 有驻留机制,
不符合驻留机制的时候, 即使两个字符串相等, 也是两个不同的对象
驻留机制并不是对所 ...

抱歉了兄弟,你是正确的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 7 天前 | 显示全部楼层
傻眼貓咪 发表于 2022-6-23 23:35
已经改了

对于 [-5,256]之间的整数数字,Python默认驻留 已经无效

  1. >>> 啊= 257
  2. >>> 吧 = 257
  3. >>> 啊 is 吧
  4. False
复制代码


我是 3.9 的版本, 可能你用的解释器不一样, 或者用的编辑器有优化
3.9 应该是挺新的了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 7 天前 From FishC Mobile | 显示全部楼层
白two 发表于 2022-6-24 00:03
我是 3.9 的版本, 可能你用的解释器不一样, 或者用的编辑器有优化
3.9 应该是挺新的了

可能是编译器优化了,我的必须经过转换或运算才能实现:
  1. 阿 = 300
  2. 吧 = 300
  3. print(阿 is 吧)
  4. 阿 += 5
  5. 阿 -= 5
  6. print(阿 is 吧)
复制代码
  1. True
  2. False
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2022-7-1 15:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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