Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                bool是int的子類
a = True print isinstance(a, int) print True == 1 print False == 0運行結(jié)果:
True True True列表循環(huán)中的變量泄露
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # 情況一 i = 1 li = [i for i in range(5)] print i # 情況二 i = 1 for i in range(5):pass print i運行結(jié)果:
4 4列表推導式和for循環(huán)對于它們的迭代變量沒有私有的作用域,為了避免泄漏變量的問題,不要在循環(huán)中使用外部同名變量。
lambda在閉包中會保存局部變量
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' alist = [lambda : i for i in range(5)] print alist for j in alist:print j()運行結(jié)果:
4 4 4 4 4原因是當賦值給alist的時候,lambda表達式就執(zhí)行了i循環(huán),直到 i =4,i會保留。
問題的本質(zhì)在與python中的屬性查找規(guī)則,LEGB(local,enclousing,global,bulitin),在上面的例子中,i就是在閉包作用域(enclousing),而Python的閉包是遲綁定,這意味著閉包中用到的變量的值,是在內(nèi)部函數(shù)被調(diào)用時查詢得到的。
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # 解決方法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()運行結(jié)果:
0 1 2 3 4重用全局變量
x=10 def demo():print xx=20print x demo()運行結(jié)果:
UnboundLocalError: local variable 'x' referenced before assignment原因是某個作用域只要有該變量的賦值語句,該變量就是局部變量。在賦值之前局部變量不存在,所以報錯。
解決方法:
x=10 def demo():global x # 使用前加全局變量,后果是x變成了全局變量print xx=20print x demo()運行結(jié)果:
10 20 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: python中函数和方法的区别
- 下一篇: Python中classmethod与s
