Python创建新对象的时机取决于类型、赋值、运算及构造函数调用:不可变对象“修改”时必新建;可变对象需显式复制才新建;字面量、工厂函数、lambda、类实例化均每次新建。

Python 创建新对象的时机,主要取决于对象的类型、赋值方式、运算操作以及是否显式调用构造函数。不是每次赋值都会新建对象,关键看是否触发了“不可变对象的副本”或“可变对象的引用”,以及是否执行了创建逻辑。
不可变对象(如 int、str、tuple)的“新对象”常被隐式触发
对不可变对象做“修改”操作(如 +=、拼接、切片)时,由于原对象无法改变,Python 必须创建一个新对象来承载结果:
-
a = "hello"; b = a + " world"→b是全新字符串对象(a不变) -
x = 5; y = x + 1→y指向新整数对象6(尽管小整数会复用,但逻辑上仍是新绑定) -
t = (1, 2); u = t + (3,)→u是新建元组,非原地修改
可变对象(如 list、dict、set)通常不自动新建,除非显式要求
直接赋值或参数传递默认是引用传递,不会创建新对象;只有调用复制方法或构造函数时才真正新建:
-
lst1 = [1, 2]; lst2 = lst1→lst2和lst1指向同一列表对象 -
lst3 = lst1.copy()或lst3 = list(lst1)或lst3 = lst1[:]→ 创建新列表对象 -
d1 = {"a": 1}; d2 = dict(d1)或d2 = d1.copy()→ 新字典对象;而d2 = d1仍是引用
函数调用和表达式求值中隐含对象创建
每次调用字面量构造或工厂函数,都会生成新对象(即使值相同):
立即学习“Python免费学习笔记(深入)”;
-
[]、{}、set()每次都返回新空容器 -
int("123")、str(42)、list("abc")都返回新对象 -
lambda x: x * 2每次定义都产生新函数对象(哪怕代码相同)
类实例化必然创建新对象
执行 MyClass() 时,Python 调用 __new__ 分配内存并返回新实例,再调用 __init__ 初始化:
-
a = MyClass(); b = MyClass()→a和b是两个独立对象(a is b为False) - 即使
__init__什么也不做,只要调用了构造函数,就已创建了新对象










