python基础13——名称空间与作用域

昨日review

0: 引用传递
python中所有值的传递,传递的都是不是值本身,而是值的引用,即内存地址

1、函数分为两大类,分别是是什么?二者在使用时有何区别?
内置函数
自定义函数


2、什么是形参、什么是实参?形参与实参之间的关系是什么?
def func(x,y):
print(x)

func(1,2)


3、简述两只形参的区别:位置形参、默认形参
x=[]
def func(name,age,gender=None):                                 # gender=列表的的内存地址
  if gender is None:
    gender=[]
  print(gender)

x.append(111)
func('egon',18)

ps:函数最理想的状态是函数的运行不受外界代码的干扰

4、简述两只实参的区别:位置实参、关键字实参

func(1,2,3,b=2,a=1,x=33)

5、简述*与**在形参与实参中的区别
def func(*args,**kwargs):
  pass
func(1,2,3,4,5,x=1,y=2,z=3)

func(*'hello') # func('h','e','l','l','o')
func(**{'a':1,'b':2}) # func(a=1,b=2)

 

6、解释下述形式,即函数wrapper的参数特点是什么
def index(x,y,z):
  print(x,y,z)

def wrapper(*args,**kwargs): # args=(1,) kwargs={'y':2,'z':3}
  index(*args,**kwargs)
  # index(*(1,),**{'y':2,'z':3})
  # index(1,z=3,y=2)

wrapper(1,z=3,y=2)

----------------------------------------------------------------------------------------------<<<<<<<<<<<<<<<我是分割线>>>>>>>>>>>>>>>>--------------------------------------------------------------------------------------------------------

名称空间与作用域

一:名称空间namespacs:存放名字的地方,是对栈区的划分

有了名称空间之后,就可以在栈区中存放相同的名字,详细的,名称空间
分为三种

1.1 内置名称空间
存放的名字:存放的python解释器内置的名字
'''
>>> print
<built-in function print>
>>> input
<built-in function input>
'''
存活周期:python解释器启动则产生,python解释器关闭则销毁


1.2 全局名称空间
存放的名字:只要不是函数内定义、也不是内置的,剩下的都是全局名称空间的名字
存活周期:python文件执行则产生,python文件运行完毕后销毁

import os

x=10
if 13 > 3:
  y=20
if 3 == 3:
  z=30

# func=函数的内存地址
def func():
  a=111
  b=222

class Foo:
  pass

 

1.3 局部名称空间
存放的名字:在调用函数时,运行函数体代码过程中产生的函数内的名字
存活周期:在调用函数时存活,函数调用完毕后则销毁
def func(a,b):
  pass

func(10,1)
func(11,12)
func(13,14)
func(15,16)


1.4 名称空间的加载顺序
内置名称空间>全局名称空间>局部名称空间

1.5 销毁顺序
局部名称空间>全局名空间>内置名称空间

1.6 名字的查找优先级:当前所在的位置向上一层一层查找
内置名称空间
全局名称空间
局部名称空间

(1)如果当前在局部名称空间:
局部名称空间—>全局名称空间->内置名称空间
input=333

def func():
  #input=444
  print(input)

func()


(2)如果当前在全局名称空间:
全局名称空间->内置名称空间
input=333
def func():
  input=444
func()
print(input)


# 示范1:
def func():
  print(x)
x=111

func()

# 示范2:名称空间的"嵌套"关系是以函数定义阶段为准,与调用位置无关
x=1
def func():
  print(x)


def foo():
  x=222
func()

foo()

# 示范3:函数嵌套定义
input=111
def f1():
  def f2():
    # input=333
    print(input)
  input=222

  f2()

f1()


# 示范4:
x=111
def func():
  print(x) #
  x=222

func()


二:作用域-》作用范围

#全局作用域:内置名称空间、全局名称空间

1、全局存活(除非被删除,否则整个文件执行过程中存活)

2、全局有效:被所有函数共享

x=111

def foo():
  print(x,id(x))

def bar():
  print(x,id(x))

foo()
bar()

print(x,id(x))

# 局部作用域: 局部名称空间的名字

1、临时存活(函数调用时临时生成,结束后释放)

2、局部有效:函数内有效

def foo(x):
  def f1():
    def f2():
      print(x)

 

LEGB

LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__

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

enclosing 外部嵌套函数的名字空间(闭包中常见)

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

builtins 内置模块的名字空间


def f1():
  # enclosing
  def f2():
    # enclosing
    def f3():
      # local
      pass

global与nonlocal

# 示范1:
x=111

def func():
  x=222

func()
  print(x)

# 示范2:如果再局部想要修改全局的名字对应的值(不可变类型),需要用global

x=111

def func():
  global x                           # 声明x这个名字是全局的名字,不要再造新的名字了
  x=222

func()
print(x)

# 示范3:

l=[111,222]
def func():
  l.append(333)

func()
print(l)


nonlocal(了解): 修改函数外层函数包含的名字对应的值(不可变类型)
x=0
def f1():
  x=11
  def f2():
    nonlocal x
    x=22
  f2()
  print('f1内的x:',x)

f1()

 

def f1():
  x=[]
  def f2():
    x.append(1111)
  f2()
  print('f1内的x:',x)

f1()

猜你喜欢

转载自www.cnblogs.com/lucky-cat233/p/12525777.html