python 对象的拷贝

##小例子

>>> a = [1, 2, 'a']
>>> b = a
>>> a
[1, 2, 'a']
>>> b
[1, 2, 'a']
>>> a.append('b')
>>> a
[1, 2, 'a', 'b']
>>> b
[1, 2, 'a', 'b']

可以看出,赋值号“=”是引用,即a 和 b 是指向一个对象。

如何实现对象的拷贝呢,python 有 copy模块。

##用法

import copy
对象2 = copy.copy(对象1)

##例子

>>> a = [1, 2, 'a']
>>> b = copy.copy(a)
>>> a
[1, 2, 'a']
>>> b
[1, 2, 'a']
>>> a.append('b')
>>> a
[1, 2, 'a', 'b']
>>> b
[1, 2, 'a']

##问题

>>> a = [[1, 2], ['a', 'b']]
>>> b = copy.copy(a)
>>> a
[[1, 2], ['a', 'b']]
>>> b
[[1, 2], ['a', 'b']]
>>> a[1].append('c')
>>> a
[[1, 2], ['a', 'b', 'c']]
>>> b
[[1, 2], ['a', 'b', 'c']]
>>> a.append((3,4,5))
>>> a
[[1, 2], ['a', 'b', 'c'], (3, 4, 5)]
>>> b
[[1, 2], ['a', 'b', 'c']]

可以看出:copy 可以实现浅层拷贝,可以通过copy.deepcoppy()来实现深层拷贝。

##深拷贝

>>> a = [[1, 2], ['a', 'b']]
>>> b = copy.deepcopy(a)
>>> a
[[1, 2], ['a', 'b']]
>>> b
[[1, 2], ['a', 'b']]
>>> a[1].append('hello')
>>> a
[[1, 2], ['a', 'b', 'hello']]
>>> b
[[1, 2], ['a', 'b']]

##对象三要素

python中的对象包含三要素:id, type, value

  1. id 用来标识唯一一个对象
  2. type标识对象的类型
  3. value用来设置对象的值。

is 判断是否是一个对象,是使用id来判断的。

== 是判断a对象的值是否是b对象的值,默认调用它的__eq__方法。

###例子

>>> a = [1, 2, 'a']
>>> b = a
>>> c = copy.copy(a)
>>> a is b
True
>>> a is c
False

"b = a" 是引用 指向的一个对象,所以a is b 返回 True

"c = copy.copy(a)" c是a的拷贝,不是指向一个对象,返回False

>>> a == c
True

但是他们的值确实是相同的