本篇文章给大家分享的是有关Python中遇到的“坑”,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
<强> 1。哪个是真的,哪个是假的? 强>
这里要看三组代码:
#第一组:
在祝辞祝辞a =256 在祝辞祝辞b =256 在祝辞祝辞a is b #,第二组: 在祝辞祝辞a =257 在祝辞祝辞b =257 在祝辞祝辞a is b #,第三组: 在祝辞祝辞a =, 257年,b =257 祝辞祝辞祝辞a is b
问题来了,这三组代码的运行结果分别是什么呢?答案是真的,假的和真的。第一组和第三组结果是真的好像没问题,那为什么第二组的结果是假呢?这里先用id()来查看一下a和b的地址是什么:
#,第一组: 在祝辞祝辞id(一个) 在在在1426657040 在祝辞祝辞id (b) 在在在1426657040 #,第二组: 在祝辞祝辞id(一个) 在在在363389616 在祝辞祝辞id (b) 在在在363392912 #,第三组: 在祝辞祝辞id(一个) 在在在5722000 在祝辞祝辞id (b) 祝辞祝辞祝辞5722000
可以看到第一组和第三组的a和b的id值是相同的,但是第二组是不同的。出现这种情况是因为Python为了避免重复的创建和回收,就把那些常用的整数缓存起来,每次需要使用时直接从缓存中拿,而不是重新创建,这些整数的范围是[256],不在这个范围之中的数字就要重新创建了。那为什么第三组的a和b是一样的呢?这是因为Python内部做了优化,对于在同一个代码块中的代码,如果出现两个值相同的整数,那么它们将被重用。这里可以用下面的代码进行测试:
a =257 b =257 def func (): ,,,c =257 ,,,印刷(a is c), #,假的 打印(a is b), #,真的 func ()
这段代码中a和b的id值是一样的,和c的id值不同。这是因为a和b在同一个代码块,而c处在func函数里,属于局部变量,和一个不在同一个代码块。所以在创建c的时候会重新创建,但是创建b的时候会重用这一个对象。
在Python的交互式命令行中,每单独一行都视为一个代码块,因此第三组中的a和b处在同一个代码块中,所以后者重用了前者,因此,两个变量的id是相同的。
<强> 2。关于正则表达式re.sub() 强>
都知道正则表达式中的re.sub()是用于字符串替换的,比如:
import 再保险 def remove_tag (html): text =, re.sub (& # 39; & lt;。* ?祝辞& # 39;,,& # 39;& # 39;,,html, re.S) return 文本
这段代码的功能就是将html中的标签都替换为空,没什么好说的,这里可以用一段html代码来测试一下:
html =,“““ & lt; ! DOCTYPE html> & lt; html> & lt; head> & lt; meta charset=癠TF-8"比; & lt; title> Document & lt;/head> & lt; body> & lt;/body> & lt;/html> “““ print (remove_tag (html)) #,文档
运行结果和我们想象的一样,但是如果html代码再长一点呢?比如下面:
html =,“““ & lt; ! Dtp-equiv=癤-UA-Compatible",内容=癷e=edge"祝辞& lt; title> Document & lt;/head> & lt; bodOCTYPE  html> & lt; html> & lt; head> & lt; meta charset=癠TF-8"比; & lt; meta name=皏iewport",内容=翱矶?设备宽度,初始=1.0,比; & lt; meta  hty> & lt; h2> h2标题& lt;/h2> & lt; h3> h3标题& lt;/h3> & lt; h4> h4标题& lt;/h4> & lt;/body> & lt;/html> “““ print (remove_tag (html)
运行结果如下:
文档 h2标题h3标题h4标题& lt;/body> & lt;/html>
为什么最后会多出来“& lt;/body> & lt;/html>“呢?这两个标签不应该被替换掉吗?问题在于re.sub()的第四个参数,这里先看下接头()函数的原型:
re.sub (repl,模式,还以为,字符串,数=0,,标志=0)
那为什么我们把re.S放在数的位置也没有报错呢?难道说再保险。年代是一个数字?打印出来看一下:
import 再保险 打印(re.S) 16 #,
原来re.S还可以当数字用!这时候数一下上面那段html代码中的标签个数,发现“& lt;/body> & lt;/html>“是第17和18个第,而因为re.S被当做16传给数参数了,就导致最后两个标签没有被替换掉。