当前位置: 首页 > 科技观察

每日一技能:为什么你的字符串和我的不一样?

时间:2023-03-19 00:16:24 科技观察

如果你经常使用Python命令行交互环境,你一定遇到过以下现象:>>>a='test'>>>a'test'>>>print(a)test首先定义了一个变量a,其值为字符串test。现在,当你在命令行交互环境中直接输入变量名并回车时,你看到的是'test',而当你输入print(a)时,你看到的是test。直接输入变量名回车,字符串会被单引号括起来。并使用print函数打印变量,字符串没有引号。如果引号只是一个小问题,让我们看看反斜杠会发生什么:>>>b='D:\game\pal4'>>>b'D:\\game\\pal4'>>>print(b)D:\game\pal4这里变量b的值为Windows下的文件夹路径。定义时,我使用一个反斜杠。当我输入变量名回车后,看到的结果是'D:\\game\\pal4',不仅最外面的引号,所有的反斜杠都变成了两个。但是当我使用打印功能打印出来时,一切又都正常了。你觉得奇怪吗?其实输入变量名回车后,看到的就是字符串的真实模样,因为Python中没有单反斜杠。当要表达反斜杠本身时,应写成\\。当然,你可以在定义时只写一个反斜杠。在大多数情况下,Python会理解您的意图,因此它会自动将单个反斜杠转换为两个反斜杠。print关键字用于打印输出,经过Python优化,更便于人类阅读。当然也可以使用print函数查看字符串的真实模样,但需要修改一下:>>>b='D:\game\pal4'>>>b'D:\\game\\pal4'>>>print(repr(b))'D:\\game\\pal4'当使用repr函数先处理字符串再打印时,其效果与直接输入变量名是一样的并按Enter。在Python中,repr(object)本质上是调用对象的__repr__方法。而如果直接print(object),其实是打印了对象的__str__方法返回的内容。让我们做一个实验:classTest:def__repr__(self):return'helloworld!'def__str__(self):return'为什么我老是跟你打招呼,因为你就是我的全世界,笨蛋'you=Test()自己测试一下,输入你回车显示显示的内容。键入print(you)会显示什么。运行效果如下图所示:从上面的例子可以看出,直接输入变量名回车和直接使用print函数打印调用是对象的不同方法。所以他们当然可以不同。回到昨天的问题。在PyCharm的debug模式下,你看到的其实是变量对象的__repr__方法返回的内容。这里的内容是字符串在Python中真实出现的样子,所以斜杠会增加。如上所述,当你输入一个Windows路径时,在大多数情况下,Python可以理解你的意图并将单反斜杠转换为双反斜杠。但也有例外,例如:假设有一个名为u6211的文件夹。它位于pal4文件夹中。那么,路径应该是:D:\game\pal4\u6211如果用Python执行,会出现什么情况?>>>c='D:\game\pal4\u6211'>>>c'D:\\game\\pal4我'>>>print(c)D:\game\pal4怎么和以前的pal4?因为\u6211是Unicode编码,意思是中文我。在这种情况下,您有两种解决方案:手动使用双反斜杠:>>>b='D:\game\pal4\\u6211'>>>b'D:\\game\\pal4\\u6211'>>>print(b)D:\game\pal4\u6211定义变量时,在字符串左边的引号左边加上字母r:>>>b=r'D:\game\pal4\u6211'>>>b'D:\\game\\pal4\\u6211'>>>print(b)D:\game\pal4\u6211二维码关注。转载本文请联系Code公众号。