zoukankan      html  css  js  c++  java
  • Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量

    ● bool是int的子

    a = True
    print isinstance(a, int)
    print True == 1
    print False == 0

    运行结果:

    True
    True
    True

    ● 列表循环中的变量泄

    # 情况一    
    i = 1
    li = [i for i in range(5)]
    print i
    # 情况二
    i = 1
    for i in range(5):
        pass
    print i

    运行结果:

    4
    4

    列表推导式和for循环对于它们的迭代变量没有私有的作用域,为了避免泄漏变量的问题,不要在循环中使用外部同名变量。

    ● lambda在闭包中会保存局部变

    alist = [lambda : i for i in range(5)]
    print alist
    for j in alist:
        print j()

    运行结果:

    4
    4
    4
    4
    4

    原因是当赋值给alist的时候,lambda表达式就执行了i循环,直到 i =4,i会保留。

    问题的本质在与python中的属性查找规则,LEGB(local,enclousing,global,bulitin),在上面的例子中,i就是在闭包作用域(enclousing),而Python的闭包是迟绑定,这意味着闭包中用到的变量的值,是在内部函数被调用时查询得到的。

    # 解决方法1:换成生成器
    alist = (lambda : i for i in range(5))
    for j in alist:
        print j()
    
    # 解决方法2:变闭包作用域为局部作用域
    alist = [lambda i=i: i for i in range(5)]
    for j in alist:
        print j()

    运行结果:

    0
    1
    2
    3
    4

    ● 重用全局变量

    x=10
    def demo():
        print x
        x=20
        print x
    demo()

    运行结果:

    UnboundLocalError: local variable 'x' referenced before assignment

    原因是某个作用域只要有该变量的赋值语句,该变量就是局部变量。在赋值之前局部变量不存在,所以报错。

    解决方法:

    x=10
    def demo():
        global x  # 使用前加全局变量,后果是x变成了全局变量
        print x
        x=20
        print x
    demo()

    运行结果:

    10
    20

    --------------------------------------------------------------------------------

    关注微信公众号(测试工程师小站)即可在手机上查阅,并可接收更多测试分享,发送【测试资料】更可获取百G测试教程~

  • 相关阅读:
    css属性选择器
    css各浏览器的兼容性写法
    使元素的宽度由内容撑开的方法
    DOM应用
    css圣杯布局、等高布局
    总结css兼容问题
    table注意事项
    相对定位、绝对定位在IE6的问题
    IE6,7下li标签的间隙
    清除浮动的7种方法
  • 原文地址:https://www.cnblogs.com/songzhenhua/p/13199869.html
Copyright © 2011-2022 走看看