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