1.哪个是True,哪个是False?

这里要看三组代码:

# 第一组:

>>>a=256

>>>b = 256

>>>a is b

# 第二组:

>>>a = 257

>>>b = 257

>>>a is b

# 第三组:

>>>a = 257; b = 257

>>>a is b

问题来了,这三组代码的运行结果分别是什么呢?答案是True、False和True。第一组和第三组结果是True好像没问题,那为什么第二组的结果是False呢?这里先用id()来查看一下a和b的地址是什么:

# 第一组:

>>>id(a)

>>>1426657040

>>>id(b)

>>>1426657040

# 第二组:

>>>id(a)

>>>363389616

>>>id(b)

>>>363392912

# 第三组:

>>>id(a)

>>>5722000

>>>id(b)

>>>5722000

可以看到第一组和第三组的a和b的id值是相同的,但是第二组是不同的。出现这种情况是因为Python为了避免重复的创建和回收,就把那些常用的整数缓存起来,每次需要使用时直接从缓存中拿,而不是重新创建,这些整数的范围是[-5, 256],不在这个范围之中的数字就要重新创建了。那为什么第三组的a和b是一样的呢?这是因为Python内部做了优化,对于在同一个代码块中的代码,如果出现两个值相同的整数,那么它们将被重用。这里可以用下面的代码进行测试:

a = 257
b = 257
def func():
c = 257
print(a is c) # False
print(a is b) # True
func()
这段代码中a和b的id值是一样的,和c的id值不同。这是因为a和b在同一个代码块,而c处在func函数里,属于局部变量,和a不在同一个代码块。所以在创建c的时候会重新创建,但是创建b的时候会重用a这个对象。
在Python的交互式命令行中,每单独一行都视为一个代码块,因此第三组中的a和b处在同一个代码块中,所以后者重用了前者,因此,两个变量的id是相同的。

2.关于正则表达式re.sub()

都知道正则表达式中的re.sub()是用于字符串替换的,比如:

import re

def remove_tag(html):
  text = re.sub('<.*?>', '', html, re.S)
  return text

这段代码的功能就是将html中的标签都替换为空,没什么好说的,这里可以用一段html代码来测试一下:

html = """
<!DOCTYPE html><html lang="en">
<head><meta charset="UTF-8">
<title>Document</title>
</head><body></body></html>
"""
print(remove_tag(html))
# Document

运行结果和我们想象的一样,但是如果html代码再长一点呢?比如下面:

html = """
<!Dtp-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head><bodOCTYPE html><html lang="en"><head><meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta hty><h1>h1标题</h1><h2>h2标题</h2><h3>h3标题</h3></body></html>
"""
print(remove_tag(html))

运行结果如下:

Document

h1标题h2标题h3标题</body></html>

为什么最后会多出来"</body></html>"呢?这两个标签不应该被替换掉吗?问题在于re.sub()的第四个参数,这里先看下sub()函数的原型:

re.sub(pattern, repl, string, count=0, flags=0)

那为什么我们把re.S放在count的位置也没有报错呢?难道说re.S是一个数字?打印出来看一下:

import re

print(re.S)
# 16

原来re.S还可以当数字用!这时候数一下上面那段html代码中的标签个数,发现"</body></html>"是第17和第18个,而因为re.S被当做16传给count参数了,就导致最后两个标签没有被替换掉。

3.字符串的lstrip()

相信很多人都用过lstrip(),在处理字符串的时候很有用,比如:

print("aabbcc".lstrip('aa'))
# bbcc
这很简单,也没什么问题,但是看下面这个例子:
print("ababacac".lstrip("ab"))
# cac
为什么结果不是acac呢?这是因为当lstrip()中传入一个字符串后,lstrip()会把这个字符串拆成一个个字符,然后才从左往右进行检查,如果匹配到就删除,直到出现第一个不同的字符,所以最后"ababa"被删掉了,结果也就是"cac"了。要避免这种情况的话,可以用replace()方法进行替换。

4.嵌套列表

如果要你创建一个包含三个空列表的列表,你会怎么做呢?

# 选项1
li =[[] for i in range(3)]
# 选项2
li = [[]*3]
# 选项3
li = [[]]*3

如果你运行一下,就会知道选项1和选项3能够得到我们想要的结果。这时候再运行一下下面这段代码:

li = [[]]*3
li[0].append(1)
print(li)
# [[1], [1], [1]]

为什么我们明明只给第一个列表增加了一个1,但是其他两个列表也增加了一个1呢?这是因为[[]]*3并不是创建了三个不同的列表,而是创建了三个指向同一个列表的对象,所以,当我们操作第一个列表时,其他两个列表内容也会发生变化。

Python中的那些“坑”的更多相关文章

  1. python中的这些坑,早看早避免。

    python中的这些坑,早看早避免. 说一说python中遇到的坑,躲坑看这一篇就够了 传递参数时候不要使用列表 def foo(num,age=[]): age.append(num) print( ...

  2. Python 中的那些坑总结——持续更新

    1.三元表达式之坑 很显然,Python把第一行的(10 + 4)看成了三元表达式的前部分,这个坑是看了<Python cookbook>(P5)中学到的,书中的代码: 2.Python生 ...

  3. 在C#中调用Python中遇到的坑(No module named xxx)

    例如Python的代码是这个样子的. # coding=<utf-> # -*- coding: utf- *- import requests import urllib def Cle ...

  4. python中的基础坑

    v = [lambda :x for x in range(10)] print(v) #[lambda :x,lambda :x....]10个匿名函数 print(v[0]) #lambda :x ...

  5. python中的一些坑(待补充)

    函数默认参数使用可变对象 def use_mutable_default_param(idx=0, ids=[]): ids.append(idx) print(idx) print(ids) use ...

  6. python中round(四舍五入)的坑

    python中的round函数不能直接拿来四舍五入,一种替代方式是使用Decimal.quantize()函数. 具体内容待补. >>> round(2.675, 2) 2.67 可 ...

  7. python中json.dumps使用的坑以及字符编码

    我们知道,python中的字符串分普通字符串和unicode字符串,一般从数据库中读取的字符串会自动被转换为unicode字符串 下面回到重点,使用json.dumps时,一般的用法为: >&g ...

  8. python中关于传递参数模块argprase的一些小坑

    今天在写代码的时候遇到了一个关于parser的一些小坑,记录在此备用. 我们知道在python中可以用argprase来传递一些参数给代码执行,来看下面的例子,假设现在有一个test文件夹,下面有3个 ...

  9. python中全局变量和局部变量的一个小坑

    python 中全局变量和局部变量在使用过程中的一个容易出错的地方 什么是全局变量 python中,在函数外部声明的变量可以叫做全局变量. x = 10 def fn1(): pass fn1() 什 ...

随机推荐

  1. jenkins构建基于gradle的springboot项目CI采坑(采用jar方式部署)

    试了一堆插件,最后用的还是 publish over SSH jenkins基本配置不多说了,就是配置一下git仓储,配置一下gradle执行命令 clean bootRepackage 之后执行Se ...

  2. python笔记:#013#高级变量类型

    高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型(float) 布尔型(bool) ...

  3. java基础语法3

    逻辑运算符 &:与,和有共同的,必须条件都满足才是true 有false就返回false,必须都是true才返回true |:或者,其中有一个满足条件就返回true ^亦或,相同是false, ...

  4. Hi,这有一份风控体系建设干货

    互联网.移动互联网.云计算.大数据.人工智能.物联网.区块链等技术已经在人类经济生活中扮演越来越重要的角色,技术给人类带来各种便利的同时,很多企业也饱受"硬币"另一面的伤害,并且形 ...

  5. 团队项目第二阶段个人进展——Day6

    一.昨天工作总结 冲刺第六天,学习了leancloud的一些数据处理知识,并看了如何在微信小程序中使用 二.遇到的问题 无 三.今日工作规划 通过动手完成一个demo来学习后端数据的请求和响应

  6. redis的持久化之AOF

    AOF Redis 分别提供了 RDB 和 AOF 两种持久化机制: RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中. AOF 则以协议文本的方式,将所有对数据库进行过写入的命令 ...

  7. QT5:C++实现基于multimedia的音乐播放器(一)

    上一篇里简略的描述了一下播放器的实现,这一篇开始具体描述一下过程. 环境配置:Qt Creator 打开Qt Creator,创建一个new project,项目名称随你喜欢(我的是MusicPlay ...

  8. Oracle客户端安装教程

    链接:http://jingyan.baidu.com/article/3d69c55165bc94f0cf02d7d9.html (按照此链接不会安装错误)

  9. mysql explain extra理解

    Extra表示附加信息,常见的有如下几种(也按查询效率从高到低排列): Using index 表示使用索引,如果只有 Using index,说明他没有查询到数据表,只用索引表就完成了这个查询,这个 ...

  10. SSM-SpringMVC-06:SpringMVC关于静态资源无法展示的问题

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 按照之前的那种方式一路走下来,或许你没发觉有问题,只是你没有使用到而已 css,js,图片等无法正常使用怎么 ...