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

Python 3.6.3中如何为函数仅存储一次常量?2013年方案是否仍适用?

嘿,这个问题问到点子上了!我来给你梳理下在Python里实现“函数仅存储一次常量”的方法,以及对比2013年和2018年Python 3.6.3的差异,还有那会儿的更优方案~

一、核心实现思路(2013年就常用的方法,3.6.3完全兼容)

这些方法在2013年的Python版本里就已经广泛使用,到2018年的3.6.3依然完全有效,逻辑没有任何变化:

1. 利用函数的属性(最灵活的方案)

Python里函数是一等对象,意味着你可以给它直接添加属性来存储常量,第一次调用函数时初始化,之后直接复用:

def my_func():
    # 检查常量是否已初始化,没的话就计算赋值
    if not hasattr(my_func, 'CONSTANT'):
        # 这里可以是耗时计算、读取配置文件等操作,只执行一次
        my_func.CONSTANT = 42 * 2  # 示例常量计算
    print(my_func.CONSTANT)

第一次调用my_func()时,会完成CONSTANT的初始化,后续所有调用都直接读取这个属性值,不会重复执行初始化逻辑。

2. 闭包(嵌套函数保存状态)

通过嵌套函数的方式,把常量放在外部函数的作用域里,外部函数执行时初始化常量,返回的内部函数每次调用都复用这个常量:

def create_my_func():
    # 这里的常量只会在调用create_my_func时初始化一次
    CONSTANT = 42 * 2
    def my_func():
        print(CONSTANT)
    return my_func

# 先创建函数实例,此时常量已经初始化完成
my_func = create_my_func()
# 后续调用都直接用这个实例,不会重复计算常量
my_func()
my_func()

这个方法在2013年和2018年的Python里都能正常工作,适合需要把常量和函数紧密绑定的场景。

3. 模块级常量(最简单的方案)

如果这个常量不需要延迟初始化(模块导入时就可以计算),直接在模块顶部定义就行,函数里直接引用:

# 模块加载时就会计算并存储这个常量,只执行一次
CONSTANT = 42 * 2

def my_func():
    print(CONSTANT)

这种方式最简洁,只要常量不是必须在函数第一次调用时才计算,这就是首选方案。

二、2018年Python 3.6.3的更优方案?

到了Python 3.6.3,之前的所有方法依然有效,而且虽然没有专门针对“函数存储一次常量”的新语法,但可以优化写法让代码更简洁:

比如函数属性的初始化可以用getattr一行搞定,替代hasattr的判断:

def my_func():
    # 若CONSTANT不存在则初始化,否则直接读取
    my_func.CONSTANT = getattr(my_func, 'CONSTANT', 42 * 2)
    print(my_func.CONSTANT)

这个写法在3.6.3里完全支持,其实2013年的Python版本(比如2.7、3.3)也支持getattr的默认参数,只是当时可能没这么普遍使用。

另外,3.6引入了f-string等语法糖,但和常量存储的核心逻辑无关,所以本质上最优方案还是基于函数属性、闭包或模块常量这几种,只是代码可以写得更清爽。

总结

  • 2013年的实现方式在2018年的Python 3.6.3里完全一致,没有失效;
  • 如果你需要延迟初始化常量(第一次调用函数才计算),函数属性或闭包是最佳选择;
  • 如果常量可以在模块导入时就初始化,模块级常量是最简单直接的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:16:58