最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python中每个人都会遇到的“坑”

    正文概述    2020-01-03   249

    Python中每个人都会遇到的“坑”

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

    相关推荐:《Python视频教程》

    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>
    <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><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中每个人都会遇到的“坑”

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元