python作用域的顺序_python—命名空间、作用域查找顺序、闭包

名称空间

name space,如下图:

x = 1, 1存放在内存中,1 会有一个内存地址,x 则 存放在 name space 里,并同时记录了 1的内存地址,

即 名称空间是存放了变量x与1绑定关系的地方

1387811-20180626085441998-1233102865.png

名称空间共3种 :

locals: 是函数内的名称空间,包括局部变量和形参。

globals: 全局变量,函数定义所在模块的名字空间。全局存活,全局有效

builtins: 内置模块的名字空间

不同变量的作用域不同就是由这个变量所在的命名空间决定的。

查看作用域方法 globals(),locals()

作用域查找顺序

level = 'L0'

n = 22

def func():

level = 'L1'

n = 33

print('func',locals())

def outer():

n = 44

level = 'L2'

print('outer',locals(),n)

def inner():

level = 'L3'

print('inner',locals(),n) #此外打印的n是多少?

inner()

outer()

func()

# 打印:

# func {'n': 33, 'level': 'L1'}

# outer {'level': 'L2', 'n': 44} 44

# inner {'level': 'L3', 'n': 44} 44

变量查找顺序:

LEGB : locals -> enclosing function -> globals -> builtins

locals 是函数内的名字空间,包括局部变量和形参

enclosing 外部嵌套函数的名字空间

globals 全局变量,函数定义所在模块的名字空间

builtins 内置模块的名字空间

python中的闭包

def func():

n = 10

def func2():

print('func2:',n)

return func2

f = func()

f() #func2: 10

外部函数func 里定义一个 内部函数func2,我们直接在外面是不能调用内部函数的。

但是现在外部函数把 内部函数给返回了,相当于我们在外面拿到了内部函数 func2.

总结一下:我们在外部可以执行func内部的函数,并且还可以用他内部函数作用域里面的变量值, 这个现象就是闭包

一点需要注意:使用闭包的过程中,一旦外函数被调用一次返回了内函数的引用,虽然每次调用内函数,是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量

#coding:utf8

def outer(x):

def inner(y):

nonlocal x

x+=y

return x

return inner

a = outer(10)

print(a(1)) //11

print(a(3)) //14

两次分别打印出11和14,由此可见,每次调用inner的时候,使用的闭包变量x实际上是同一个 !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值