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

Python循环创建类实例时默认参数生成重复对象的原因是什么?

现象原因

这是Python特有的函数默认参数求值规则导致的,和面向对象设计本身无关:

  • Python中所有函数(包括类的构造方法__init__)的默认参数值,只会在函数定义阶段计算一次,不会在每次调用函数时重新生成。
  • 你的__init__方法在定义时,就已经执行了get_first_name()和get_last_name()两个函数,生成的随机姓名被固定为参数默认值,后续所有不传参创建Person实例的操作,都会复用这两个固定值,因此所有实例姓名完全一致。
  • 第一段代码输出不同姓名,是因为你每次创建实例时都主动传入了新生成的随机姓名,没有使用默认参数,自然每次都是新的结果。

如果你想实现不传参时也能生成不同的随机姓名,正确的写法如下:

class Person():
    def __init__(self, first_name=None, last_name=None):
        # 生成逻辑写在方法内部,每次实例化都会重新执行
        self.first_name = first_name if first_name is not None else get_first_name()
        self.last_name = last_name if last_name is not None else get_last_name()

跨语言通用性说明

这个特性不是所有面向对象编程语言的通用规则,仅为Python的设计选择:

  • 大部分常见面向对象语言(比如JavaScript、Java)的函数默认参数,都是在每次调用时才求值,写相同逻辑的代码不会出现这个问题。
  • 只有Python及极少数设计思路类似的语言,会采用函数定义阶段预计算默认参数的规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:45:04