鱼C论坛

 找回密码
 立即注册
查看: 1003|回复: 8

[已解决]字符串问题: r"\" 为什么报错呢?

[复制链接]
发表于 2018-5-18 22:54:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

代码的“输入” 和 “输出” 如下:

In: "\"        # Out 是 报错——————1
In: r"\"       # Out 是 报错
——————2

In: "\k"       # Out 是 "\\k"——————3
In: r"\k"      # Out 是 "\\k"——————4
In: "\\k"      # Out 是 "\\k"——————5

In: r"\\k"     # Out 是 "\\\\k"——————6
In: "\\\k"     # Out 是 "\\\\k"——————7
In: r"\\\k"    # Out 是 "\\\\\\k"——————8
In: "\\\\k"    # Out 是 "\\\\k"——————9

注释:以上是shell输出,不是print的显示

以下是问题:
一、第1、2行为什么会报错? “r”的存在不就是为了“禁止转义”吗?(等价于“\\” 吗?)
二、第3、4、5行为什么输出是一样的?
三、第6、7、9行为什么输出是一样的? (第7行的输出为什么是“四个”反斜杠?)
四、第8行的输出为什么不等于第9行?


(上面看的可能会有些眼花~~问题也有点绕,抱歉
最佳答案
2018-5-19 00:10:26
你的表述很神奇。。。。。。。
好吧,我再给你解释一波。。。。
1、2报错,因为你的写法就是错的,shell中先对
  1. '或者"
复制代码
进行转义,然后就认为你是不完整的字符串,就是少了半边引号的那种,所以报错。
至于
  1. r'\k'
复制代码
等类似的写法,输出的\数量是''中的两倍,理由很简单,shell中的输出就是字符串类型的,但是它的输出是无法加r的,因此只能用\来转义\使得\确实是\。于是最后每个\前面都加了一个\。
至于前面没有r的。。偶数个的话刚好,两两转换。。。输入和输出是一致的,奇数个的话,转义是从左到右的\\代表\,最后真实字符串都可以统一成n个\加'\k'的形式。。。显然\k在shell中只能\\k表达。。。这里的原因要追溯一下python设计的历史、、、不展开了。自己Google吧,一个问题不能都靠别人解答。
欢迎采纳答案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-18 23:42:17 | 显示全部楼层
In是什么完意????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 23:46:49 | 显示全部楼层
同样也是初学,互相交流下

1,2 问题相同,因为\会把后边紧跟的字符(如果拼接起来是一个特殊字符的话)做转义,很显然此时\把"给转义了(因为\"表示一个字符),那么也就是变成了,你要打印一个",但问题是,如果你要打印一个字符串,就要写一对",但你少写了一个" (另一个被转义了,不算字符串的标识了)

3中,k不需要转义,所以打印依然是\k
4中,r表示打印原字符,转义无效,所以打印是\k
5中,\\的意思是转义本身,转义结果就是\,结果也是\k
(可以试下打印 "a\tb" 和 r"a\tb")

6打印\\k,原因参考下4
7其实是3个字符,\\、\、k,其中\\是转义自身,结果是\,所以拼接起来是\\k
8r表示打印原字符,转义无效,字符串是什么就打印什么
9总共3个字符,\\、\\、k,其中\\是转义自身,结果是\,所以拼接起来是\\k

一些字符跟在\后边默认会被转义,比如" ' \ t n r 之类的,还有注意字符串打印是从前到后执行的!!如果有转义,都是两个合起来是一个字符,不会突然从中间掏出一个来!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-19 00:10:26 | 显示全部楼层    本楼为最佳答案   
你的表述很神奇。。。。。。。
好吧,我再给你解释一波。。。。
1、2报错,因为你的写法就是错的,shell中先对
  1. '或者"
复制代码
进行转义,然后就认为你是不完整的字符串,就是少了半边引号的那种,所以报错。
至于
  1. r'\k'
复制代码
等类似的写法,输出的\数量是''中的两倍,理由很简单,shell中的输出就是字符串类型的,但是它的输出是无法加r的,因此只能用\来转义\使得\确实是\。于是最后每个\前面都加了一个\。
至于前面没有r的。。偶数个的话刚好,两两转换。。。输入和输出是一致的,奇数个的话,转义是从左到右的\\代表\,最后真实字符串都可以统一成n个\加'\k'的形式。。。显然\k在shell中只能\\k表达。。。这里的原因要追溯一下python设计的历史、、、不展开了。自己Google吧,一个问题不能都靠别人解答。
欢迎采纳答案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-19 00:11:51 | 显示全部楼层
卧槽。。评论被吞了、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-19 23:25:46 | 显示全部楼层
Charles未晞 发表于 2018-5-19 00:10
你的表述很神奇。。。。。。。
好吧,我再给你解释一波。。。。
1、2报错,因为你的写法就是错的,shell ...

非常感谢,刚开始有点没读懂什么意思,反复思考您的答案,想得越深入,回过头来看答案越发觉得在理,哈哈哈哈哈哈哈!!
另外关于python设计历史的资料有什么相关的书籍可以查看吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-19 23:34:58 | 显示全部楼层
后羿射天 发表于 2018-5-18 23:46
同样也是初学,互相交流下

1,2 问题相同,因为\会把后边紧跟的字符(如果拼接起来是一个特殊字符的话)做 ...

哈哈哈,非常感谢你这么细心的一一回答!!参考了你和楼下的答案,现在我已经全部搞懂啦!!不知道你学了多久了?对字符串就有这么深的了解了,我感觉自己学习有点草率,把小甲鱼的整本书看完了还有这么多基础的问题没搞懂~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-20 15:59:18 | 显示全部楼层
kerwin_lui 发表于 2018-5-19 23:34
哈哈哈,非常感谢你这么细心的一一回答!!参考了你和楼下的答案,现在我已经全部搞懂啦!!不知道你学了 ...

共同进步吧,我有java经验,现在想增加一点技术储备,就从B站看视频学习,有过代码开发经验的可能接受的快一点,但对无编程经验的小伙伴来说,如果每个事例都自己敲一遍的话,会进步较快的,这东西和学英语差不多,只看视频看书提升较慢,还是直接上手敲代码。。记得之前老师说代码敲够10W行,差不多就是一个初级程序员了~~~与君共勉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-20 16:03:17 | 显示全部楼层
后羿射天 发表于 2018-5-20 15:59
共同进步吧,我有java经验,现在想增加一点技术储备,就从B站看视频学习,有过代码开发经验的可能接受的 ...

哈哈好的,共同进步!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 17:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表