You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python装饰器代码预期输出1次'hello'实际输出2次的原因

现象原因

两次打印是Python装饰器语法的固有执行逻辑导致的,@装饰器名称是Python提供的语法糖,会在被装饰函数定义完成后立刻执行装饰器调用,不需要手动触发。

代码的完整执行顺序拆解:

  • 第一步:解释器加载定义hello函数,此时仅创建函数对象,不会运行函数内部的打印语句。
  • 第二步:解释器执行到@hello装饰hi函数的逻辑,这部分代码等价于hi = hello(hi):等def hi(): pass定义完hi函数对象后,会立刻把hi作为参数传入hello函数调用,这是第一次触发print('hello')。另外你的hello函数没有设置返回值,默认返回None,所以这一步执行完后,变量hi存储的值已经不是原来的函数,而是None。
  • 第三步:执行最后一行手动写的hello(hi),再次主动调用hello函数,传入的参数是上一步得到的None,这是第二次触发print('hello')。

如果把装饰器语法糖展开成等价的普通Python代码,逻辑会更清晰:

def hello(hi):
    print('hello')

# @hello 装饰器等价于下面这两行
def hi():
    pass
hi = hello(hi)  # 第一次打印hello

hello(hi) # 第二次打印hello

内容的提问来源于stack exchange,提问作者dekalog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:42:58