Python函数进阶:对象特性、嵌套定义、名称空间与作用域详解

拾光
拾光
发布时间:2026-10-14 | 4人浏览过
原创

本文深入解析Python中函数作为对象的核心特性,包括引用、传参、返回值及容器存储。详细阐述函数嵌套定义与调用的执行逻辑,并系统讲解内置、全局、局部三种名称空间的加载与查找顺序。最后通过global和nonlocal关键字演示作用域变量的修改机制,帮助开发者掌握Python函数的高级用法。

函数的对象

在Python语言中,万物皆对象,函数也不例外。这意味着函数可以被赋值给变量,可以作为参数传递给其他函数,也可以作为返回值返回,甚至可以作为元素存储在容器中。理解这一特性是掌握Python函数式编程的基础。

函数对象的四大功能

引用


def f1():
  print('from f1')
f1() #调用函数
print(f1)
print('*'*50)
f = f1 # 将函数名f1赋值给f
f() # f也可以调用函数
print(f)
from f1
<function f1 at 0x000001FB05534620>
**************************************************
from f1
<function f1 at 0x000001FB05534620>

函数名本质上是一个变量名,它指向函数体所在的内存地址。因此,函数名不仅可以接收函数执行后返回的值,还可以像普通变量一样进行赋值操作。例如,将函数名赋值给另一个变量后,新变量同样可以调用该函数。

当做参数传给一个函数


def f1():
  print('from f1')

def f2(a):
  return a
f3 =f2(f1)
f3()
print(f3)

from f1
<function f1 at 0x00000275FA914620>

可以当做函数的返回值


def f1():
  print('from f1')
def f2():
  return f1
f3 =f2()
f3()
print(f3)
from f1
<function f1 at 0x0000014931304620>

可以当做容器类型的元素


def f1():
  print('from f1')

l = [1,2,3,f1]
l[3]()

from f1

函数的嵌套

函数的嵌套定义

在函数内部定义另一个函数称为嵌套定义。需要注意的是,内部定义的函数只能在外部函数的作用域内被调用,无法在外部函数之外直接使用内部函数,否则会导致NameError。

函数的嵌套调用


from math import pi
def circle(r,action):
  if action == 'p':
    def perimeter():
      return 2 * pi * r
    res = perimeter()
  elif action == 'a':

    def area():
      return pi * r**2
    res = area()
  else:
    return ' '
  return res
result = circle(2,'p')
print(result)
12.566370614359172

名称空间与作用域

名称空间

名称空间是内存中用于存储变量名与变量值绑定关系的区域,即存放变量名的空间。根据生命周期和可见性的不同,Python中的名称空间主要分为三种类型。

内置名称空间

内置名称空间存放了Python解释器内置的所有名字,例如数据类型int、float以及内置函数len等。这些名字在解释器启动时即可直接使用。

len() int()

内置名称空间的生命周期从解释器启动时开始,直到解释器关闭时失效。它是始终存在的,且优先级最高。

全局名称空间

全局名称空间用于存放除了内置名称和局部名称之外的所有名字。例如,在脚本顶层定义的变量x、函数func、列表l等都会存储在此空间中。

全局名称空间的生命周期从文件执行时开始,直到文件执行结束后失效。它贯穿整个脚本的运行过程。

局部名称空间

局部名称空间用于存放函数调用期间,函数体内部产生的名字。每个函数调用都会创建一个新的局部名称空间,用于隔离该函数的局部变量。


def f1():
  x = 1
  def f2(): # f2就是局部名称空间
    pass
  f2() 

局部名称空间的生命周期从函数调用时开始,直到函数执行结束后失效。每次调用函数都会重新创建和销毁该空间。

加载顺序 (考试必考)

名称空间的加载顺序固定为:内置名称空间 -> 全局名称空间 -> 局部名称空间。这意味着内置名字最先加载,局部名字最后加载。

查找顺序 (考试必考)

当访问一个变量时,Python会按照当前名称空间 -> 全局名称空间 -> 内置名称空间的顺序进行查找。如果当前处于局部作用域,则查找顺序为局部 -> 全局 -> 内置。这种机制确保了局部变量优先于全局和内置变量。

作用域

作用域指的是变量或函数起作用的范围。作用域关系在函数定义阶段就已经确定,而不是在调用阶段确定。

作用域关系在函数定义阶段就已经确定好了

不同的函数之间可能存在相同名字的变量,但它们属于不同的作用域,彼此互不影响。例如,全局变量和局部变量即使名字相同,也是两个独立的变量。

全局作用域

全局作用域适用于全局名称空间和内置名称空间。在全局作用域中,可以访问内置名字和全局名字,但通常不建议修改内置名字。

局部作用域

局部作用域仅适用于局部范围。在局部作用域中定义的变量,只能在当前函数内部访问,外部无法直接获取。


x =100
def f1():
  x =1
  print(x) # 定义阶段
f1()

global 局部修改全局 (了解,面试常用)


x =100
def f1():
  global x
  x =1
  # print(x)
f1()
print(x)

nonlocal 把局部改成外部


xxxxxxxxxx9 1  def f1():2  x =13  def f2():4    nonlocal x 5    x =36  f2()7  print(x)8f1()93pythono

总结

以上所述是小编给大家介绍的python函数的对象、函数嵌套、名称空间和作用域,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表