Python的Socket知识4:作用域

1、Python无块级作用域

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

name='HH'
for i in range(10):
    name=i
print(name)

执行结果为:9

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

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

def f1():
    name="hh"
print(name)

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

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

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

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

name="HH"
def f1():
    name='a'
   def f2():
        name='b'
      print(name)
    f2()
f1()

输出结果:b

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

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

name="HH"
def f1():
    print(name)#f1的作用域,name=HH
def f2():
      name='b'#f2的作用域,name=b
    f1()#只要执行f1,无论在哪里,都寻找f1的作用域,也即name=HH
f2()

执行结果为HH。

另一个案例

name="HH"
def f1():
    print(name)
def f2():
    name='b'#作用域仅在f2
   return  f1
ret=f2()#ret代指的f1
ret()#运行f1(),去找f1的作用域

执行结果为HH

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

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

#只在x>6的时候加10
li=[x+10 for x in range(10) if x>6]
print(li)

执行结果


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

li=[lambda :x for x in range(10)]
print("1",print(li))#结果为一个个的函数
print("2",li[0]())#结果为9
print("3",li[1]())#结果仍然为9
#li列表中的元素:【函数、函数、。。】

执行结果:

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

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

#因只执行了def f1,并未执行函数体中的东西
li=[]
for i in range(10):
    def f1():
        return i
    li.append(f1)
print("1:",print(li))#li是列表,内部元素是相同功能的9个函数
print("2:",li[0]())#执行第一个元素,即f1,加括号表示执行函数体的东西,因函数体未定义i,因此往上找到全局的i
print("3:",li[1]())#同li[0](),执行结果为9

执行结果:

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

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

#因只执行了def f1,只有函数加()时才执行函数体
li=[]
for i in range(10):
    def f1(x=i):
        return x
    li.append(f1)
print("1:",print(li))#li是列表,内部元素是相同功能的函数
print("2:",li[0]())#执行第一个元素,即f1,加括号表示要执行函数体中的东西,因为函数体定义了x,执行结果为0
print("3:",li[1]())#执行结果为1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值