首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python的Socket知识4:作用域

1、Python无块级作用域

案例1:python、javascript无块级作用域,块级指缩进的块,比如if..else,for等;但c、java有块级作用域。

name='HH'

foriinrange(10):

name=i

print(name)

执行结果为:9

2、Python中没有块级作用域,但是有局部作用域,函数就是一个单独的局部作用域。

案例2:仅以函数作为作用域

deff1():

name="hh"

print(name)

执行结果:出错,因为name的作用域在函数f1内

3、Python中有作用域链,变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错。

案例3:Python的作用域链是由内往外找,找不到报错。

最外层为全局的作用域,往里是f1的作用域,再往里是f2的作用域

name="HH"

deff1():

name='a'

deff2():

name='b'

print(name)

f2()

f1()

输出结果:b

4、在函数体没有执行之前,作用域和作用域链已经确定了

案例4:执行函数时,只需要去自己的作用域找就可以

name="HH"

deff1():

print(name)#f1的作用域,name=HH

deff2():

name='b'#f2的作用域,name=b

f1()#只要执行f1,无论在哪里,都寻找f1的作用域,也即name=HH

f2()

执行结果为HH。

另一个案例

name="HH"

deff1():

print(name)

deff2():

name='b'#作用域仅在f2

returnf1

ret=f2()#ret代指的f1

ret()#运行f1(),去找f1的作用域

执行结果为HH

5、函数体中无参数,则去全局找,如果函数体没有调用之前,函数内部不执行。

案例5-1:列表与for循环结合。

#只在x>6的时候加10

li=[x+10forxinrange(10)ifx>6]

print(li)

执行结果

案例5-2,lambda是函数,如果函数未调用时,内部是不会执行的

li=[lambda:xforxinrange(10)]

print("1",print(li))#结果为一个个的函数

print("2",li[]())#结果为9

print("3",li[1]())#结果仍然为9

#li列表中的元素:【函数、函数、。。】

执行结果:

案例5-3:如果函数体中无定义参数,则取全局变量

f函数体内的return一直没有被执行,而i是变化的,最后是9,因此,再去执行f1时,取到的是全局变量i=9

#因只执行了def f1,并未执行函数体中的东西

li=[]

foriinrange(10):

deff1():

returni

li.append(f1)

print("1:",print(li))#li是列表,内部元素是相同功能的9个函数

print("2:",li[]())#执行第一个元素,即f1,加括号表示执行函数体的东西,因函数体未定义i,因此往上找到全局的i

print("3:",li[1]())#同li[0](),执行结果为9

执行结果:

案例5-4:函数加()才会执行函数体,当函数体中有定义变量时,则取自己的作用域.

而f1(x=i)这句是执行的,所以x的值会变化

#因只执行了def f1,只有函数加()时才执行函数体

li=[]

foriinrange(10):

deff1(x=i):

returnx

li.append(f1)

print("1:",print(li))#li是列表,内部元素是相同功能的函数

print("2:",li[]())#执行第一个元素,即f1,加括号表示要执行函数体中的东西,因为函数体定义了x,执行结果为0

print("3:",li[1]())#执行结果为1

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180218G0DGKF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券