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

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

本文深入解析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 相关产品和应用

全部下载

专题列表