字符串离奇消失之谜

简介: 字符串离奇消失之谜

今天在交流群里,有人问了这样一个问题:


1.png


截图中涉及到的图片为:


2.png


一开始,我以为这是一个简单的问题,但后来发现事情并没有这么简单。


我要来了这个同学的代码,并在 PyCharm 里面使用调试模式运行,效果如下图所示:


3.png


截至到倒数第二行,con 字符串里面的数据还是正常的。但是一旦使用 print函数打印

出来,数据又不对了。


为了说明这个问题,我写一段代码简单复现一下这个问题。


4.png

image.gif

从截图中可以看到,a就是一个普通的列表,它并不是什么生成器。当我们直接 for 循环展开 a 列表,然后打印里面的数据的时候,都可以正常显示。但是当我提前使用''.join(a)想把 a 列表里面的字符串拼接成一个字符串的时候,却发现只能显示 a 列表里面最后一个字符串。前两个字符串离奇消失了。


为了解释这个问题为什么会发生,我们来看看a列表长什么样:


5.png

image.gif

可以看到,a列表里面,前两个元素的末尾都有一个\r。我们再来看看使用''.join(a)生成的 b 字符串长什么样:


6.png


image.gif

注意,这里需要直接输入字符串的名字来显示它真实的样子,不能使用 print函数打印。这两者的区别,大家可以看我的这篇文章:【一日一技】揭秘字符串的两副“面孔”


大家看出来了吗?实际上,当我们执行''.join(a)的时候,它是正确拼接了 a 列表里面的三个字符串的,得到的结果就是abc\rdef\rxyz\r。但坏就坏在这里出现了\r。这个符号在这里不是制表符,而是告诉输出的游标,现在移动到行首。


怎么理解这个现象呢,我们假设现在有编号为1-9的9个桶和编号为1-9的9个小球。正常情况下,把1号球放进1号桶,2号球放进2号桶,3号球放进3号桶……9号球放进9号桶。这是我们正常打印的流程。


但现在,我们在3-4号球之间加入一个特殊球,上面写着\r。在6-7号之间也加入一个\r球。首先把1号球放进1号桶,2号球放进2号桶,3号球放进3号。然后,你看到了\r球,这个球不放进桶里面,但是需要你回到了1号桶,把4号球放进1号桶,5号球放进2号桶,6号球放进3号。接下来,你又遇到了\r球,你又回到了1号桶旁边,把7号球放进1号桶,8号球放进2号桶,9号球放进3号。一番操作下来,所有桶里面,最上面的球只有7,8,9号。其他的1-6号球都被覆盖了。


注意,这里我用桶里面放球来举例,而不用 Word 打字来举例,是因为当我们使用 Word 的时候,如果你把光标重新移动到行首输入新的字符,已有的字符会按顺序往后退。但今天我们遇到的情况,是按顺序覆盖。所以不要搞混这两种情况。


为了证明这个按顺序覆盖,我们来看下面这个例子:


7.png


请大家记住上面桶里面放球的例子,\r球是不放进桶里面的,它是告诉你要回到行首。所以,我们的第一个字符串是11111111111,由于它后面有一个\r,所以现在重新回到行首,继续输出22222。这里有5个2,所以此时字符串变成了22222111111。这时又遇到了一个\r,所以又回到了行首,输出333。所以最终的结果是33322111111


这个问题的关键就是\r,而不是''.join()有什么问题,你甚至可以直接手动输入带有\r的字符串,效果是一样的:


8.png


另外还需要注意的是,这个\r只会影响print函数的打印输出。但这个字符串本身不会出现\r后面的字符覆盖前面的字符。所以,对于一个字符串aaaaa\rbb,我们可以看到虽然 print打印出来只有bbaaa5个字符,但是它实际上有8个字符:


9.png


请关注微信公众号【未闻Code】获取更多精彩文章。

目录
相关文章
|
1月前
|
缓存 前端开发 Java
去掉 if...else 的七种绝佳之法...
去掉 if...else 的七种绝佳之法...
|
11月前
|
人工智能 自然语言处理 机器人
ChatGPT被玩疯,问“如果美国倒了,世界会怎样?”回答太吓人了
ChatGPT被玩疯,问“如果美国倒了,世界会怎样?”回答太吓人了
|
Python
字符串离奇消失之谜
字符串离奇消失之谜
70 0
|
SQL 存储 关系型数据库
消失的 100 万,炸了!
事务是在 MySQL 引擎层实现的,我们常见的 InnoDB 引擎是支持事务的,事务的四大特性是原子性、一致性、隔离性、持久性,我们这次主要讲的是隔离性。当多个事务并发执行的时候,会引发脏读、不可重复读、幻读这些问题,那为了避免这些问题,SQL 提出了四种隔离级别,分别是读未提交、读已提交、可重复读、串行化,从左往右隔离级别顺序递增
消失的 100 万,炸了!
|
人工智能 算法 vr&ar
「缸中之脑」成真?动态电极绕过眼睛直接刺激大脑,在盲人脑海画出字母
最新研究绕过眼睛,通过动态电极刺激大脑,直接让天生的盲人脑海中出现字母!「智子倒计时」、「缸中之脑」、「黑客帝国」,让人分不清虚拟还是现实的直接意识输入,或许真的离我们不远了。
225 0
「缸中之脑」成真?动态电极绕过眼睛直接刺激大脑,在盲人脑海画出字母
爷青又回!太空浪子迷失太空,漂泊半个世纪,又找到了回地球的轨道!
爷青又回!太空浪子迷失太空,漂泊半个世纪,又找到了回地球的轨道!
195 0
|
机器学习/深度学习 人工智能 自动驾驶
人工智能们再也不用担心撞上玻璃橱窗了
自动送货车撞上玻璃、扫地机器人撞碎玻璃伤行人……如今这些事件也即将成为过去式。大连理工大学等单位研发了一个玻璃检测神经网络,能够利用 AI 在真实环境下检测玻璃。
584 0
人工智能们再也不用担心撞上玻璃橱窗了
|
分布式计算 大数据 MaxCompute
三七女生节,看程序媛们选好口红色号,踩上高跟鞋,特别美丽,特别凶狠,特别温柔~
口红,尿不湿,代码;撒娇,卖萌,撕叉;烈焰红唇倾斜45度角写代码;我爱你,你用知性保持着最致命的吸引力!
2077 0
|
人工智能 大数据 测试技术
Master没学过人类棋谱?这才是它比老AlphaGo更恐怖之处
在Master完成60胜,结束人机车轮战后,因与AlphaGo对战而成名的欧洲围棋冠军樊麾就在社交网络上发表了一篇公告。 在这篇公告中,谷歌公司明确表示Master是“阿法狗”的升级测试版,而在其中更是有个惊人的所在——Master可能完全没学过棋谱,而这也侧面印证了Master不按常理出牌的套路
4972 0