如何解决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.b
和obj2.b
是完全不同的实例变量。我知道如果我做类似的事情
Obj.a = 20
obj1.a
和obj2.a
均为20。
现在假设a
的size为N位。当我复制obj1
的a时,内存是否为a
在内存中存储了另一个obj2.a
(浪费了另外N位),或者obj2.a
只是指向了同一位置记忆为obj1.a
?
编辑:在我的程序中,类变量是一个Set,一个int和一个元组,我想在所有副本之间共享它们而不浪费内存!
解决方法
正如Barmar在评论中提到的那样,Python不会复制数字之类的不可变对象,只要它们本身不包含可变对象即可。但是,如果a
和b
是列表,
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.a
和obj2.a
共享内存。 obj1.b
和obj2.b
不会。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。