Python中遇到的“坑”

  介绍

本篇文章给大家分享的是有关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传给数参数了,就导致最后两个标签没有被替换掉。

Python中遇到的“坑”