返回顶部
首页 > 资讯 > 后端开发 > Python >Python中的那些“坑”
  • 615
分享到

Python中的那些“坑”

Python 2023-01-30 23:01:31 615人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

这里要看三组代码: # 第一组: >>>a=256 >>>b = 256 >>>a is b # 第二组: >>>a = 257 >>>b =

这里要看三组代码:

# 第一组:

>>>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是相同的。

都知道正则表达式中的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参数了,就导致最后两个标签没有被替换掉。

 

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

 

print("aabbcc".lstrip('aa'))
# bbcc

 

 

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

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

# 选项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并不是创建了三个不同的列表,而是创建了三个指向同一个列表的对象,所以,当我们操作第一个列表时,其他两个列表内容也会发生变化。

--结束END--

本文标题: Python中的那些“坑”

本文链接: https://lsjlt.com/news/181377.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python中的那些“坑”
    这里要看三组代码: # 第一组: >>>a=256 >>>b = 256 >>>a is b # 第二组: >>>a = 257 >>>b = ...
    99+
    2023-01-30
    Python
  • python3中import的那么些坑
    多模块开发时注意事项 通过from 模块 import 变量,此时相当于给一个变量赋值 import time # 相当于在本文件中创建了一个名为time变量,这个变量指向python标准库中的time模块 from time ...
    99+
    2023-01-31
    import
  • oracle 12.1的那些坑
    1 数据库不重启也会把一些启动信息打在日志上,让你怀疑这库是不是无厘头重启,最重要的是没有其他的相关日志,让你怀疑是不是不要干DBA这行了;1.1禁止参数信息dump至Alert日志中  &nbs...
    99+
    2024-04-02
  • Python里那些深不见底的“坑”
    Python是一门清晰简洁的语言,如果你对一些细节不了解的话,就会掉入到那些深不见底的“坑”里,下面,我就来总结一些Python里常见的坑。 列表创建和引用 嵌套列表的创建 使用*号来创建一个嵌套的list: li = [[]...
    99+
    2023-01-31
    见底 Python
  • Shell中关于exit0的那些坑
    在 shell 编程中,需慎用 exit 0! 首先必须弄清楚 exit 0 不是 return 0, 区别在于 return 0 用于函数中,表示函数执行成功返回 0;而 exit...
    99+
    2024-04-02
  • Oracle 中关于 group by 的那些坑
    分组聚合Group by  在mysql中,对group by 的使用限制是比较宽松,还是比较灵活的, 表数据之间的调取是完全没问题的; 而在Oracle中,对group by 就有一定限制,两句相同的SQL语句,可能在mys...
    99+
    2021-03-16
    Oracle 中关于 group by 的那些坑
  • Shell中关于exit 0的那些坑
    在 shell 编程中,需慎用 exit 0! 首先必须弄清楚 exit 0 不是 return 0, 区别在于 return 0 用VGqldKkU于函数中,表示函数执行成功返回 0;而 exit 0 则代表你当前程序...
    99+
    2022-06-05
    Shellexit0
  • Python学习教程(Python学习路线):那些年我们踩过的那些坑。。。
    Python学习教程(Python学习路线):那些年我们踩过的那些坑。。。坑01 - 整数比较的坑在 Python 中一切都是对象,整数也是对象,在比较两个整数时有两个运算符 == 和 is ,它们的区别是:is 比较的是两个整数对象的id...
    99+
    2023-06-02
  • 细数java for循环中的那些坑
    目录1、循环语句的几种语法2、循环中需要注意的点2.1 循环如果满足了查找的需求 break 直接跳出,不要浪费性能2.2 循环集合的时候能用for each 的尽量用for eac...
    99+
    2024-04-02
  • 解决spring data redis的那些坑
    目录spring data redis的那些坑1. 使用lua脚本,返回类型解析错误2. spring redis基于lettuce配置Client必须显示调用spring data...
    99+
    2024-04-02
  • Android开发中那些需要注意的坑
    这个是看知乎的时候发现的一个问题,感觉挺有意思,就将自己遇到的坑记录下来。 1、Andorid L theme colorPrimary 不能使用带有alpha的颜色值,否则会...
    99+
    2022-06-06
    android开发 Android
  • 报表选型中那些想不到的坑
    详情链接:http://c.raqsoft.com.cn/article/1571024764129r=gxy...
    99+
    2023-06-02
  • 那些年踩过的Dubbo坑有哪些
    那些年踩过的Dubbo坑有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言微服务架构在如今的9102年已经不是什么新鲜的话题了,但是怎么做好微服务架构,却又是一个永恒...
    99+
    2023-06-19
  • Java Bean转Map的那些踩坑实战
    目录一、背景二、那些坑2.0 测试对象2.1 JSON 反序列化了类型丢失2.1.1 问题复现2.2.2 问题描述2.2 BeanMap 转换属性名错误2.2.1 commons-b...
    99+
    2024-04-02
  • python中那些时间
    Python具有良好的时间和日期管理功能。实际上,计算机只会维护一个挂钟时间(wall clock time),这个时间是从某个固定时间起点到现在的时间间隔。时间起点的选择与计算机相关,但一台计算机的话,这一时间起点是固定的。其它的日期信...
    99+
    2023-01-31
    时间 python
  • 详细总结Java for循环的那些坑
    目录一、循环语句的几种语法二、循环中需要注意的点三、循环中的坑四、总结一、循环语句的几种语法 语法: for循环格式: for(初始化语句;条件判断;递进语句){ 循环体; } ...
    99+
    2024-04-02
  • 解决Golang 中使用WaitGroup的那点坑
    sync.WaitGroup对于Golang开发者来说并不陌生,其经常作为多协程之间同步的一种机制。用好它势必会让你事半功倍,但是一旦错用将引发问题。 关于WaitGroup的使用网...
    99+
    2024-04-02
  • 编程生涯 21 载,那些我踩过的坑
    “作为一个有着21岁编程年龄的中年程序员,我可以自豪地说,我成功地经历了软件行业这个充满变数的世界的高峰和低谷。这篇文章记录了迄今为止我在软件开发的职业生涯中所犯的错误,同时也是如何避免这些错误的一本指南。”...
    99+
    2023-06-03
  • Android WebView那些坑之上传文件示例
    最近公司项目需要在WebView上调用手机系统相册来上传图片,开发过程中发现在很多机器上无法正常唤起系统相册来选择图片。 解决问题之前我们先来说说WebView上传文件的逻辑:...
    99+
    2022-06-06
    示例 上传文件 webview Android
  • JavaScript RequireJS 的那些坑,踩过一次终身免疫!
    RequireJS 是一个流行的 JavaScript 模块加载器,它可以帮助您组织和加载模块。然而,在使用 RequireJS 时,也可能会遇到一些坑。本文总结了常见的 RequireJS 坑及其解决方案,帮助您避免踩坑。 坑1:加载...
    99+
    2024-02-22
    RequireJS 模块加载器 解决方案
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作