Python趣味篇:字符串中的趣味瞬间

在这里插入图片描述

前言

​ 说起Python,可能大多数学过的人都会赞赏它语法简洁明了,可是其实Python也会有许多有意思的瞬间,你真的学会了Python了吗?看看下面几个小问题。

1,真假字符串

>>> a = 'python'
>>> b = 'python'

>>> a is b
True


>>> a = 'python!'
>>> b = 'python!'

>>> a is b
False

>>> a = 'python!';b = 'python!'
>>> a is b
True

​ 为什么第一个是两个python判断为True,而第二个加了!以后则判断为False了呢?而第三个怎么又变成True了?

​ 首先我们知道正常来说,如果创建相同的字符串,它会指向已创建的对象,如下图所示。

在这里插入图片描述

但是在编译的时候会出现一个隐式驻留的情况:字符串中如果只包含数字,字符和下划线就会被驻留,就不会创建一个新的对象。但是"python!''包含了!所以不被驻留从而需要创建新对象,这个现象有兴趣大家可以去验证一下(使用python解释器)

为什么同一行声明又变成了True呢?因为在同一行操作,解释器能够发现已经创建了该对象’python!',赋值给a,b;如果不在同一行,由于上述原因它则发现不了。

2,真假数字

>>> a = 256
>>> b = 256

>>> a is b
True

>>> a = 257
>>> b = 257

>>> a is b
False


>>> a = 257; b = 257
>>> a is b
True

为什么数字也会出现这种情况呢?我们得了解一个概念叫做预先加载,把要用到的事物先准备好,所谓未雨绸缪就是这个意思。 在启动Python解释器的时候,-5–256的对象就已经预先分配好了内存。所以a ,b在等于256时并没有去创建新对象,而是指向了预先就加载好的256内存地址。

PS:Pycharm预先加载的范围会更大,所以很占内存

在这里插入图片描述

而在a,b=257时,由于257是一个新的对象,并且在不同行创建时,会分属各自的代码块整数空间。这个知识点大家可以去看看命名空间,而在同一行创建时,因为属于同一空间不会额外创建。

3,看不见的幽灵字符串?

>>> "aabb".count("a")
2
>>> "aabb".count("b")
2
>>> "aabb".count("")
5

​ wtf? 为什么会有5的计数?这是什么?

​ 其实这是因为字符串之间是有缝隙的,而这个5就是5个缝隙“”,它们拼接起了每个字符串。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/AI19970205/article/details/124514957