Python函数赋值给变量的两种形式:引用与执行的区别

小石头
小石头
发布时间:2026-10-13| 4人浏览过
原创

本文深入解析Python中将函数赋值给变量的两种常见形式:直接赋值与调用后赋值。通过对比a=f与a=f(),阐明前者是将函数对象作为引用传递给变量,后者则是执行函数并将返回值赋给变量。结合闭包与装饰器实例,揭示赋值过程中函数执行的副作用,帮助开发者避免常见误区。

前言

本文主要介绍在Python中将函数赋值给变量时需要注意的关键问题,分享相关经验供参考学习。下面直接切入主题,详细解析具体细节。

常见将函数赋值给变量的形式主要有两种,一种是

a=f

另一种是

a=f()

这两种形式在语义和行为上存在显著区别,下面分别进行总结。

1. a=f型:将变量指向函数对象

通过代码验证如下:

>>> f = abs
>>> f(-10)
10

这表明变量f现在指向了abs函数本身。直接调用abs()函数与调用变量f()的效果完全相同。这是廖雪峰老师Python教程中的经典案例,此时调用f()和调用abs()在行为上是一致的。

再举一个工厂函数的例子:

def maker(N):

  def action(X):

    return X**N

  return action

这个嵌套函数的外层返回值为内层函数的函数名,注意这里没有括号,有无括号有着本质区别。此时调用外部函数:

f=maker(2)

如上所述,f便指向了action函数,且其限制条件为N=2,可以理解为f是当N等于2时的action函数实例。我们来调用它:

>>> f(3)
9

这证明了f和action函数在功能上是等价的。

2. a=f()型:将f()的返回值赋值给a

这里的a仅仅接收f()的返回值,如果f()没有显式返回值,那么a即被赋值为None。这里值得注意的一点是,在a=f()的执行过程中,f()会实际运行一次,这也是容易忽略的细节,例如:

>>> def add(x,y):
    z=x+y
    print(z)
>>>a=add(3,4)
7

这里虽然只执行了一条赋值语句,但却输出了结果7,说明在赋值过程中函数add已经被执行了。然而a的值为None,且只能通过print语句才能显示出来。不只是赋值过程函数会执行,写在return语句中也会触发同样的行为。

>>>def log(func):
   def wrapper(*args, **kw):
     print('call %s():' % func.__name__)
     return func(*args, **kw)
   return wrapper
>>>@log
>>>def now():
    print('2015-3-25')

这是廖雪峰老师Python教程装饰器章节的例程。刚开始我以为return func(*args,**kw)这个语句是返回了now()函数(即func函数)的返回值,后来发现now函数没有返回值,即为None,所以其实是这个语句在赋值过程中,

 func(*args,**kw)执行了,即函数now的print语句被执行了。

在下面的习题中,一个变形要求是在函数调用的前后打印出'begin call'和'end call'。下面一位网友的程序是这样写的:

def wrapper(*args,**kw):
   print(t+'begin call')
   result=func(*args,**kw)
   print(t+'end call')
   return result

开始不太理解为什么使用result=func(*args,**kw)这句,后来理解后才明白其实赋值本身并没有实际意义,只是这句话同时使得func函数运行了,所以写成

def wrapper(*args,**kw):
   print(t+'begin call')
   func(*args,**kw)
   print(t+'end call')

结果也是一样的。

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助。如果有疑问大家可以留言交流,谢谢大家对本站的支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。