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. 【leetcode】 算法题 两数之和

      问题       给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 1 ...

  2. 初探Margin负值(转)

    相对而言,margin 负值的使用机率在布局中似乎很少,但是我相信一旦你开始掌握就会着迷,接下来我们看看关于margin负值的一些资料: 它是一个有效的属性,至少w3c中明确描述如下:”Negativ ...

  3. 使用xshell链接虚拟机的方法

    给大家介绍一下虚拟机和Xshell5连接的基本配置1.安装虚拟机,跟着提示一步一步安装即可,注意添加镜像文件,虚拟机就完成了.2.下载一个Xshell5,安装好之后.要修改虚拟机的网卡状态    1) ...

  4. 条件随机场CRF(三) 模型学习与维特比算法解码

    条件随机场CRF(一)从随机场到线性链条件随机场 条件随机场CRF(二) 前向后向算法评估标记序列概率 条件随机场CRF(三) 模型学习与维特比算法解码 在CRF系列的前两篇,我们总结了CRF的模型基 ...

  5. jsp 条件查询、列表分页

    条件查询 dao //根据搜索条件筛选数据 public List<User> GetUserBySearch(String userName, String sex) throws SQ ...

  6. macbook 添加快捷启动服务

    来至 Mac OS X: Launch Terminal from keyboard shortcut os x 上很多功能都可以通过Apple自家的Automator.app创建,且使用此方法可以为 ...

  7. map和set的原理

    1)map:经过排序了的二元组的集合,map中的每个元素都是由两个值组成,其中的key(键值,一个map中的键值必须是唯一的) 是在排序或搜索时使用,它的值可以在容器中重新获取:而另一个值是该元素关联 ...

  8. 静态代码扫描工具PMD定制xml的规则(一)操作篇

    0.前言 PMD作为开源的静态代码扫描工具有很强的扩展能力,可使用java或xpath定制rule.第一篇从操作上讲解如何定制一个用于扫描xml是否规范的规则.首先我们知道xml格式的文件在java工 ...

  9. Sign http

    http接口请求参数签名工具类的实现和测试代码 http://blog.csdn.net/5iasp/article/details/52539901 http://www.what21.com/pr ...

  10. 你不知道的JavaScript--Item16 for 循环和for...in 循环的那点事儿

    大家都知道在JavaScript中提供了两种方式迭代对象: for 循环: for..in循环: 1.for循环 不足: 在于每次循环的时候数组的长度都要去获取: 终止条件要明确: 在for循环中,你 ...