Python-deepcopy是否在内存中创建Class / Static变量的另一个副本?

问题描述

这几乎是我提出的另一个不清楚的问题的转贴。

import copy

class Obj:
    a = 3

    def __init__(self,n: int):
        self.b = n

obj1 = Obj(10)

obj2 = copy.deepcopy(obj1)

我知道obj1.bobj2.b是完全不同的实例变量。我知道如果我做类似的事情

Obj.a = 20

obj1.aobj2.a均为20。

现在假设a的size为n位。当我复制obj1的a时,内存是否为a在内存中存储了另一个obj2.a(浪费了另外n位),或者obj2.a只是指向了同一位置记忆为obj1.a

编辑:在我的程序中,类变量一个Set,一个int和一个元组,我想在所有副本之间共享它们而不浪费内存!

解决方法

正如Barmar在评论中提到的那样,Python不会复制数字之类的不可变对象,只要它们本身不包含可变对象即可。但是,如果ab是列表,

class Obj:
    a = [0,1,2]

    def __init__(self,n: list):
        self.b = n

obj1 = Obj([10,20,30])

obj2 = copy.deepcopy(obj1)
print(hex(id(obj1)),hex(id(obj1.a)),hex(id(obj1.b)))
# Output: 0x1aa036cd7c8 0x1aa03670ec8 0x1aa036eddc8
print(hex(id(obj2)),hex(id(obj2.a)),hex(id(obj2.b)))
# Output: 0x1aa036db5c8 0x1aa03670ec8 0x1aa036cf308

更多测试:

obj2.a[0] = 100
print(obj1.a)
# Output: [100,2]

因此,要回答您的问题: obj1.aobj2.a共享内存。 obj1.bobj2.b不会。