0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python中的那些坑

马哥Linux运维 来源:博客园 2024-07-16 17:52 次阅读

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内部做了优化,对于在同一个代码块中的代码,如果出现两个值相同的整数,那么它们将被重用。这里可以用下面的代码进行测试:

#Python学习交流群:778463939
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 = """


Document

"""
print(remove_tag(html))
# Document

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

html = """
Document


h1标题

h2标题

h3标题

""" print(remove_tag(html))

运行结果如下:

Document

 


h1标题h2标题h3标题

为什么最后会多出来呢?这两个标签不应该被替换掉吗?问题在于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代码中的标签个数,发现是第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并不是创建了三个不同的列表,而是创建了三个指向同一个列表的对象,所以,当我们操作第一个列表时,其他两个列表内容也会发生变化。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 字符串
    +关注

    关注

    1

    文章

    578

    浏览量

    20508
  • 代码
    +关注

    关注

    30

    文章

    4780

    浏览量

    68539
  • python
    +关注

    关注

    56

    文章

    4793

    浏览量

    84634

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

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何避开智能硬件创业的那些

    大数据等附加价值。今天我们邀请到幻响神州创始人兼CEO张总,为大家解答如何避开智能硬件创业的那些。专家介绍:张昕尉是十年创业老兵,2016年2月带领幻响新三板上市,坚持原创态度,以虔诚之心做企业做产品
    发表于 03-14 10:13

    python2和python3同时安装的详细步骤

    整理下python2和python3同时安装详细步骤希望对大家有帮助已踩过(亲测可用!!!)
    发表于 10-27 09:31

    运放那些——第二篇

    运放那些——第二篇
    的头像 发表于 08-31 11:37 1.5w次阅读
    运放<b class='flag-5'>中</b>的<b class='flag-5'>那些</b><b class='flag-5'>坑</b>——第二篇

    运放那些——第一篇

    运放那些——第一篇
    的头像 发表于 08-31 11:40 4.5w次阅读
    运放<b class='flag-5'>中</b>的<b class='flag-5'>那些</b><b class='flag-5'>坑</b>——第一篇

    Python程序员必须掌握从Python2到Python3的转型

    本书的目标读者是那些正在使用 Python,又想熟悉 Python 3 的程序员。如果你懂 Python2,但是想迁移到 Python 3.
    发表于 09-14 10:54 10次下载

    如何让你的Python编程不出现反模式?避免初学Python常见的错误

    篇文章收集了我在Python新手开发者写的代码中所见到的不规范但偶尔又很微妙的问题。本文的目的是为了帮助那些新手开发者渡过写出丑陋的Python代码的阶段。
    的头像 发表于 09-24 10:38 2785次阅读

    如何快速学习Python?学习Python有哪些

    此外,作为人工智能的主要编程语言,未来的几年,Python势必继续高歌。而近期,数据科学网站KDnuggets,发布的2018数据科学和机器学习工具调查结果也显示:Python荣登第一,成为最受青睐
    的头像 发表于 11-29 10:11 3912次阅读
    如何快速学习<b class='flag-5'>Python</b>?学习<b class='flag-5'>Python</b>有哪些<b class='flag-5'>坑</b>?

    关于 STM32 时钟配置的那些

    关于STM32时钟配置的那些
    的头像 发表于 03-08 12:06 5914次阅读

    python的优缺点有哪些

    Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以胜任那些非常非常复杂的应用程序开发。
    的头像 发表于 01-16 09:20 3494次阅读

    “I2C”的那些

    “I2C”的那些 一般情况下, i2c 设备焊接没什么问题,按照设备手册一步步来,基本上就顺风顺水能够用起来。如果这么一个简单的东西,有时候想要的结果死活不出来,反复的检查问题的原因,查询解决办法
    发表于 11-06 10:05 8次下载
    “I2C”的<b class='flag-5'>那些</b><b class='flag-5'>坑</b>

    Arduino-IDE配置ESP32-CAM开发环境踩过的那些

    Arduino-IDE配置ESP32-CAM开发环境踩过的那些
    发表于 11-30 18:36 24次下载
    Arduino-IDE配置ESP32-CAM开发环境踩过的<b class='flag-5'>那些</b><b class='flag-5'>坑</b>

    EFM32PG1B使用时遇到那些

    EFM32PG1B使用时遇到那些的坑坑一:引脚功能定义二:外部中断的使用官网链接一:引脚功能定义 公司项目需要用到EFM32系列的单片机,初看芯片手册,看到引脚定义的时候着实有些疑惑 初看的第一
    发表于 12-03 15:06 3次下载
    EFM32PG1B使用时遇到<b class='flag-5'>那些</b>的<b class='flag-5'>坑</b>

    EFM32PG1B关于RTCC和EM4的那些

    EFM32PG1B关于RTCC和EM4的那些EFM32PG1B关于RTCC和EM4的那些坑坑一:RTCC初始化二:EM4低功耗模式的初始化
    发表于 12-04 19:36 10次下载
    EFM32PG1B关于RTCC和EM4的<b class='flag-5'>那些</b><b class='flag-5'>坑</b>

    pythonnumber代表什么

    Python,number(数字)是一种内置的数据类型,用于表示数值。Python提供了几种不同的number类型,分别是整数(int)、浮点数(float)、复数(complex)和布尔值
    的头像 发表于 11-22 09:50 2024次阅读

    pythontext的用法

    Python的text是一个常见的数据类型,它用于存储和处理文本数据。在Python,文本常常被表示为字符串(string),字符串是一系列Unicode字符的有序序列。 在
    的头像 发表于 11-23 15:46 3604次阅读