hello? 发表于 2022-6-23 22:38:28

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

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}的子字符串")
      
#不知道为什么

傻眼貓咪 发表于 2022-6-23 22:47:34

is 关键字用于测试两个变量是否引用同一对象。
== 比较对象是否相等

wp231957 发表于 2022-6-23 22:51:15

==才是判断两个变量是否相等
is是判断两个变量是否指向一个地址

hello? 发表于 2022-6-23 22:58:50

傻眼貓咪 发表于 2022-6-23 22:47
is 关键字用于测试两个变量是否引用同一对象。
== 比较对象是否相等

我用is判断是否为同一对象,j is Z应当返回True啊(此时j和Z都是"abc"),所以最终应当打印出来才对{:10_277:}

傻眼貓咪 发表于 2022-6-23 23:04:03

hello? 发表于 2022-6-23 22:58
我用is判断是否为同一对象,j is Z应当返回True啊(此时j和Z都是"abc"),所以最终应当打印出来才对{:10_ ...

我测试没有问题啊?
print("apple" is "oren")
print("apple" is "apple")False
True

wp231957 发表于 2022-6-23 23:06:02

傻眼貓咪 发表于 2022-6-23 23:04
我测试没有问题啊?

带空格的字符串就完蛋了

傻眼貓咪 发表于 2022-6-23 23:11:12

wp231957 发表于 2022-6-23 23:06
带空格的字符串就完蛋了

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

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

白two 发表于 2022-6-23 23:28:35

本帖最后由 白two 于 2022-6-23 23:30 编辑

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


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


例如:
>>> a = 'aabb@#'
>>> b = 'aabb@#'
>>> a is b
False
>>> a = 'abc'
>>> b = 'abc'
>>> a is b
True

>>> a = 'abcd'
>>> b = 'abc'
>>> id(a)
2881267427440
>>> id(b)
2881267427440
>>> a is b
True
但是如果:
>>> id(a)
2881301834288
>>> id(b)
2881302064944
>>> a is b
False
因为这里是两个新的对象

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

>>> str3='sten'
>>> str4=str3+'waves'
>>> str4 is 'stenwaves'# run_time
False

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

>>> j = ''
>>> j += 'abc'
>>> j is a
True

傻眼貓咪 发表于 2022-6-23 23:35:27

白two 发表于 2022-6-23 23:28
python 有驻留机制,
不符合驻留机制的时候, 即使两个字符串相等, 也是两个不同的对象
驻留机制并不是对所 ...

已经改了

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

可以试试:
print(id(3000), id(3000))
print(id(-12345), id(-12345))
print(456789 is 456789)

hrpzcf 发表于 2022-6-23 23:42:52

傻眼貓咪 发表于 2022-6-23 23:35
已经改了

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


什么版本

傻眼貓咪 发表于 2022-6-23 23:53:03

hrpzcf 发表于 2022-6-23 23:42
什么版本

抱歉了,我好像误解了,因为非常好奇为什么会改,所以上网爬文,经过测试好像必须转成字符串,再转回整型,才能真正测出来。
for num in range(300):
        a = int(str(num))
        b = int(str(num))
        print(num, a is b)

傻眼貓咪 发表于 2022-6-23 23:53:54

白two 发表于 2022-6-23 23:28
python 有驻留机制,
不符合驻留机制的时候, 即使两个字符串相等, 也是两个不同的对象
驻留机制并不是对所 ...

抱歉了兄弟,你是正确的{:10_266:}

白two 发表于 2022-6-24 00:03:17

傻眼貓咪 发表于 2022-6-23 23:35
已经改了

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


>>> 啊= 257
>>> 吧 = 257
>>> 啊 is 吧
False

我是 3.9 的版本, 可能你用的解释器不一样, 或者用的编辑器有优化
3.9 应该是挺新的了

傻眼貓咪 发表于 2022-6-24 00:22:36

白two 发表于 2022-6-24 00:03
我是 3.9 的版本, 可能你用的解释器不一样, 或者用的编辑器有优化
3.9 应该是挺新的了

可能是编译器优化了,我的必须经过转换或运算才能实现:阿 = 300
吧 = 300
print(阿 is 吧)
阿 += 5
阿 -= 5
print(阿 is 吧)True
False
页: [1]
查看完整版本: 小甲鱼作业:子字符串和父字符串(大佬帮忙看一下)