python类中变量作用域_Python中的变量作用域
1、塊級作用域
1 if 1 == 1:2 name = "lzl"
3
4 print(name) //輸出lzl5
6
7 for i in range(10):8 age =i9
10 print(age) //輸出9
在Java/C#中,執行上面的代碼會提示name,age沒有定義,而在Python中可以執行成功,這是因為在Python中是沒有塊級作用域的,代碼塊里的變量,外部可以調用,所以可運行成功
2、局部作用域
1 deffunc():2 name = "lzl"
3
4 print(name) //拋出異常
name變量只在func()函數內部中生效,所以在全局中是沒法調用的
3、作用域鏈
1 name = "lzl"
2 deff1():3 name = "Eric"
4 deff2():5 name = "Snor"
6 print(name)7 f2()8 f1() //輸出Snor
Python中有作用域鏈,變量會由內到外找,先去自己作用域去找,自己沒有再去上級去找,直到找不到報錯
4、終極版作用域o( ̄▽ ̄)d
1 name = "lzl"
2
3 deff1():4 print(name)5
6 deff2():7 name = "eric"
8 f1()9
10 f2() //輸出lzl
這一段代碼可以做如下理解:
1 name = "lzl"
2
3 deff1():4 print(name)5
6 deff2():7 name = "eric"
8 returnf19
10 ret =f2()11 ret()
f2()執行結果為函數f1的內存地址,即ret=f1;執行ret()等同于執行f1(),執行f1()時與f2()沒有任何關系,name=“lzl”與f1()在一個作用域鏈,函數內部沒有變量是會向外找,所以此時變量name值為“lzl”
5、面試題一道
1 li = [lambda :x for x in range(10)]
判斷下li的類型?li里面的元素為什么類型?
1 print(type(li))2 print(type(li[0]))3
4 #
5 #
可以看到li為列表類型,list里面的元素為函數,那么打印list里面第一個元素的返回值,此時返回值為多少?
1 li = [lambda :x for x in range(10)]2
3 res =li[0]()4 print(res)5
6 #輸出:9
li第一個函數的返回值為9還不是0,記住:函數在沒有執行前,內部代碼不執行;
解析:這是一個列表解析表達式,每個元素都是一個函數,每個函數返回的是x的值。for x in range(10)會循環10次,直到x=9結束,所以x的值是9,然后生成一個函數列表,每個函數的功能是返回x的值。
res = li[0]()
此時,調用函數列表中的第一個函數,也就是返回x的值,而x的值上面已經知道了就是9
所以最后輸出的是9
所以最重要的一點就是,在列表解析式中,循環10次生成的只是函數,她不會返回x的值因為它還沒有調用~也就是還沒執行~
總結
以上是生活随笔為你收集整理的python类中变量作用域_Python中的变量作用域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: convert.todatetime指定
- 下一篇: 2018年计算机CPU纳米制程,AMD发