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
相关产品推荐
相关产品推荐

