一日一技:怎么你的字符串跟我不一样

开发 前端
首先定义一个变量a,它的值为字符串test。现在,当你在命令行交互环境直接输入变量名再回车的时候,你看到的是'test',当你输入print(a)的时候,你看到的却是test。

[[430121]]

如果你经常使用Python的命令行交互环境,你一定遇到过下面这个现象:

  1. >>> a = 'test'  
  2. >>> a  
  3. 'test'  
  4. >>> print(a)  
  5. test  

首先定义一个变量a,它的值为字符串test。现在,当你在命令行交互环境直接输入变量名再回车的时候,你看到的是'test',当你输入print(a)的时候,你看到的却是test。

直接输入变量名回车,字符串会被单引号包起来。而使用print函数打印变量,字符串又没有引号。

如果说引号只是一个小问题的话,再来看看反斜杠会怎么样:

  1. >>> b = 'D:\game\pal4'  
  2. >>> b  
  3. 'D:\\game\\pal4'  
  4. >>> print(b)  
  5. D:\game\pal4  

在这里,b变量的值为Windows下面的一个文件夹路径。在定义的时候,我使用的是单根反斜杠。

当我输入变量名,然后回车时,看到的结果是'D:\\game\\pal4',不仅有最外层的引号,而且反斜杠全部变成了两根。

但是当我使用print函数打印出来的时候,一切又正常了。

觉得很诡异吗?

实际上,输入变量名,回车以后,你看到的才是这个字符串真正的样子,因为在Python里面是不存在单根反斜杠的。当你要表示反斜杠本身的时候,就应该是\\这种写法。

当然在定义的时候你可以只写单根反斜杠,在大多数情况下,Python会理解你的意图,所以它会自动把单根反斜杠转换为两个反斜杠。

而使用print关键字打印出来的,是经过Python优化,更便于人类阅读的样子。

当然,使用print函数也能看到字符串真正的样子,不过需要修改一下:

  1. >>> b = 'D:\game\pal4'  
  2. >>> b  
  3. 'D:\\game\\pal4'  
  4. >>> print(repr(b))  
  5. 'D:\\game\\pal4'  

当你使用repr函数先处理字符串,再打印时,它的效果就和直接输入变量名回车是一样的了。

在Python中,repr(对象)本质上是调用了对象的__repr__这个方法。而如果直接print(对象),实际上是打印了对象__str__方法返回的内容。我们来做一个实验:

  1. class Test:  
  2.     def __repr__(self):  
  3.         return 'hello world!'  
  4.     def __str__(self):  
  5.         return '为什么我总是对你说你好,因为你是我的世界啊,傻瓜'  
  6. you = Test()  

动手测试一下,输入you然后直接回车显示的是什么内容。输入print(you)显示的又是什么内容。

运行效果如下图所示:

从上面的例子可以看出,直接输入变量名回车和直接用print函数打印调用的是对象的不同方法。所以他们当然可以不一样。

回到昨天的问题上来。在PyCharm的调试模式中,你看到的内容实际上是变量对象的__repr__方法返回的内容,这里的内容是字符串在Python里面的真正的样子,所以斜杠会变多。

上面说到,当你输入Windows路径的时候,大多数情况下,Python能够理解你的意图,把单根反斜杠转成双反斜杠。不过也有例外的情况,例如:假设有一个文件夹的名字叫做u6211。它在pal4文件夹里面。那么,路径应该是:D:\game\pal4\u6211 如果在Python里面执行,会出现什么问题?

  1. >>> c = 'D:\game\pal4\u6211'  
  2. >>> c  
  3. 'D:\\game\\pal4我'  
  4. >>> print(c)  
  5. D:\game\pal4我  

怎么和前面的pal4拼在一起了?因为\u6211是一个Unicode编码,表示中文我。

这种情况下,你有两种解决方式:

  • 手动使用双反斜杠:
  1. >>> b = 'D:\game\pal4\\u6211'  
  2. >>> b  
  3. 'D:\\game\\pal4\\u6211'  
  4. >>> print(b)  
  5. D:\game\pal4\u6211  

在定义变量的时候,字符串左侧引号的左边加上字母r:

  1. >>> b = r'D:\game\pal4\u6211'  
  2. >>> b  
  3. 'D:\\game\\pal4\\u6211'  
  4. >>> print(b)  
  5. D:\game\pal4\u6211  

本文转载自微信公众号「未闻Code」,可以通过以下二维码关注。转载本文请联系未闻Code公众号。

 

责任编辑:武晓燕 来源: 未闻Code
相关推荐

2022-11-06 21:04:49

字符串字段参数

2012-03-07 17:24:10

戴尔咨询

2012-12-20 10:17:32

IT运维

2022-06-20 19:37:59

Python字符串HTML

2010-01-05 10:40:07

.NET Framew

2021-03-18 23:28:45

Python反斜杠字符串

2021-05-08 19:33:51

移除字符零宽

2021-04-27 22:15:02

Selenium浏览器爬虫

2021-10-15 21:08:31

PandasExcel对象

2017-05-25 15:02:46

联宇益通SD-WAN

2021-04-05 14:47:55

Python多线程事件监控

2022-06-28 09:31:44

LinuxmacOS系统

2022-03-12 20:38:14

网页Python测试

2015-10-19 12:33:01

华三/新IT

2021-07-08 21:49:13

前端后端Cookies

2016-05-09 18:40:26

VIP客户缉拿

2021-04-12 21:19:01

PythonMakefile项目

2017-11-03 07:57:19

2021-03-12 21:19:15

Python链式调用

2021-09-13 20:38:47

Python链式调用
点赞
收藏

51CTO技术栈公众号