python3-深浅copy

转载:https://www.cnblogs.com/ctztake/p/8194275.html

术语

  • 变量:是一个系统表的元素,拥有指向对象的连接空间。
  • 对象:被分配的一块内存,存储其所代表的值。
  • 引用:是自动形成的从变量到对象的指针。
  • 注意:类型(int类型,long类型(python3已除去))对于对象,不是变量。
  • 不可变对象:一旦创建就不可修改的对象,包括字符串,元组,数字。
  • 可变对象:可以修改的对象,包括列表,字典。(可通过hash()来判断对象是否可变)

关于python3深浅拷贝,会以下面三个点来讲述。

  1. 赋值
  2. 浅copy
  3. 深copy

1.赋值

在python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。

>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
>>> var2 = var1
>>> id(var1)
1937003361288
>>> id(var2)
1937003361288
##var1, var2引用的同一个字典对象(内存地址一样), 所以该字典的任何改动,都会影响到var1,var2

如图:

2.浅拷贝

浅拷贝: 浅拷贝值只拷贝一层,具有自己单独的内存地址。二层或其他层不拷贝,指向原有的内存地址。

# 导入拷贝模块
>>> import copy
>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
# 使用浅拷贝的方式
>>> var2 = copy.copy(var1)
# 两个变量的内存地址是不一样的
>>> id(var1)
2084726354952
>>> id(var2)
2084730248008
# 但是他们的元素内存地址是一样的
>>> id(var1["k1"])
2084726207464
>>> id(var2["k1"])
2084726207464

##浅copy只拷贝一层,也就是'k1' 'k2'以及所对应的值完全是两份数据,没有关联,修改了var1的'k1',var2不会有影响。 对于'k3'的值来说,不属于第一次内容,所以修改会互相影响。

如图:

3.深copy

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

# 导入拷贝模块
>>> import copy
>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
# 使用深拷贝的方式把var1的内容拷贝给var2
>>> var2 = copy.deepcopy(var1)
# var1和var2的内存地址是不相同的
>>> id(var1)
1706383946760
>>> id(var2)
1706389852744
# var1和var2的元素"k3"内存地址是不相同的
>>> id(var1["k3"])
1706389853576
>>> id(var2["k3"])
1706389740744
# var1和var2的"k3"元素的内存地址是相同的
>>> id(var1["k3"][1])
1706383265744
>>> id(var2["k3"][1])
1706383265744
 

猜你喜欢

转载自www.cnblogs.com/Xuuuuuu/p/10140582.html