Python - deepcopy() 是否会在内存中创建另一个 Class/Static 变量副本?
Python - does deepcopy() creates another copy of Class/Static variables in memory?
这几乎是我提出的另一个不太清楚的问题的转贴。
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。
现在假设 sizeof a
是 N 位。当我复制 obj1
的 a 时,内存是否在内存中存储另一个 a
(浪费另外 N 位)用于 obj2.a
还是 obj2.a
只是指向相同的位置内存为 obj1.a
?
编辑:在我的程序中,class 变量是一个集合、一个整数和一个元组,我想在所有副本之间共享它们而不浪费内存!
正如 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, 1, 2]
所以,回答你的问题:
obj1.a
和 obj2.a
共享内存。 obj1.b
和 obj2.b
没有。
这几乎是我提出的另一个不太清楚的问题的转贴。
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。
现在假设 sizeof a
是 N 位。当我复制 obj1
的 a 时,内存是否在内存中存储另一个 a
(浪费另外 N 位)用于 obj2.a
还是 obj2.a
只是指向相同的位置内存为 obj1.a
?
编辑:在我的程序中,class 变量是一个集合、一个整数和一个元组,我想在所有副本之间共享它们而不浪费内存!
正如 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, 1, 2]
所以,回答你的问题:
obj1.a
和 obj2.a
共享内存。 obj1.b
和 obj2.b
没有。