美文网首页
Python——"is" , "==" and "深浅copy"

Python——"is" , "==" and "深浅copy"

作者: 岁月神偷_bde8 | 来源:发表于2017-09-05 20:37 被阅读0次

1."is" 和 "=="的区别是什么?

== 比较的是变量的值

is 比较的是变量的内存地址

例如 :

a = 1, b = 1

a is b

此时返回结果为True

is 比较的是两个变量的存储地址

在python中,从-5——256的整数是存放在同一块内存中的,所以当我们这样定义时:

a = 257, b = 257

返回值为False,当变量大于256或者小于-5时,返回值就会从True变为False

而我们的"=="比较的是两个变量的值

所以无论怎么定义包括字符串在内,只要值相等,a == b 的返回值就是True

2.赋值、深拷贝和浅拷贝的区别是什么?

⑴赋值(assignment)

>>>a = [1,2,3]

>>>b = a

>>>print(id(a), id(b), sep='\n')

139701469405552

139701469405552

在Python中,用一个变量给另一个变量赋值,其实就是给当前内存中的对象增加一个“标签”而已。

如上例,通过使用内置函数 id() ,可以看出 a 和 b 指向内存中同一个对象。a is b会返回 True 。

⑵、前拷贝和深拷贝(deep copy)

所谓“深拷贝”,是指创建一个新的对象,然后递归的拷贝原对象所包含的子对象。深拷贝出来的对象与原对象没有任何关联。

深拷贝只有一种方式:copy模块中的deepcopy函数。

>>> import copy

>>>a= [1,2,3]

>>>b= copy.deepcopy(a)

>>>print(id(a),id(b))

140601785065840    140601785066200

>>>for x, y in zip(a,b):

 ...print(id(x),id(y))

...

140601911441984       140601911441984

140601911442016       140601911442016

140601911442048       140601911442048

看了上面的例子,有人可能会疑惑:

为什么使用了深拷贝,a和b中元素的id还是一样呢?

答:这是因为对于不可变对象,当需要一个新的对象时,python可能会返回已经存在的某个类型和值都一致的对象的引用。而且这种机制并不会影响 a 和 b 的相互独立性,因为当两个元素指向同一个不可变对象时,对其中一个赋值不会影响另外一个。

我们可以用一个包含可变对象的列表来确切地展示“浅拷贝”与“深拷贝”的区别:

>>>importcopy

>>>a = [[1,2],[5,6], [8,9]]

>>>b = copy.copy(a)  # 浅拷贝得到b

>>>c = copy.deepcopy(a)  # 深拷贝得到c

>>>print(id(a), id(b))  # a 和 b 不同

139832578518984   139832578335520

>>>forx, yinzip(a, b):# a 和 b 的子对象相同

...print(id(x), id(y))

...

139832578622816   139832578622816

139832578622672   139832578622672

139832578623104   139832578623104

>>>print(id(a), id(c))  # a 和 c 不同

139832578518984   139832578622456

>>>forx, yinzip(a, c):  # a 和 c 的子对象也不同

...print(id(x), id(y))

...

139832578622816     139832578621520

139832578622672      139832578518912

139832578623104      139832578623392

从这个例子中可以清晰地看出浅拷贝与深拷贝地区别。

总结:

1、赋值:简单地拷贝对象的引用,两个对象的id相同。

2、浅拷贝:创建一个新的组合对象,这个新对象与原对象共享内存中的子对象。

3、深拷贝:创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象与原对象没有任何关联。虽然实际上会共享不可变的子对象,但不影响它们的相互独立性。

浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其它对象的对象,如列表,类实例。而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。

                                                                              ————摘自博客余功鹏

相关文章

  • Python——"is" , "==" and "深浅copy"

    1."is" 和 "=="的区别是什么? == 比较的是变量的值 is 比较的是变量的内存地址 例如 : a = ...

  • python——深浅copy

    通过下面的输出结果可以很好的看到: 1)深拷贝是直接复制了所有的父对象跟子对象,原来的不管怎么变都跟他没关系 2)...

  • 内存管理

    ARC MRC 属性 循环引用 深浅copy一 ,先说深浅copy概念很简单 浅copy 就是copy...

  • 6、python集合,深浅copy

    集合,深浅copy 一、集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是...

  • python中的深浅copy

    深浅拷贝:数据分离情况 1. =赋值:数据完全共享(指向内存中的同一个对象) 被赋值的变量指向的数据和原变量的数据...

  • 深浅copy

    概念:浅拷贝:不拷贝对象,只拷贝对象指针,因此不会产生新的对象。深拷贝:拷贝对象到新的内存,因此会产生新的对象。 ...

  • 深浅copy

    深浅copy 浅拷贝:指针拷贝,复制一个新的指针,指向同一块内存区域。实际内存并没有发生拷贝 深拷贝:内容拷贝,拷...

  • Python 百度面试总结

    1、 考查知识点:列表,深浅copy。弄清楚就ok 2、 用python , 123456789变成9876543...

  • python 的深浅copy 与 赋值

    赋值 对于赋值运算,就是共同指向一个内存地址,将一个值赋予一个变量,那么它的内存地址同时也赋予了他,如果值是不可变...

  • Python的直接赋值,深拷贝和浅拷贝以及使用场景

    概述 深浅拷贝用法来自copy模块导入模块: import copy浅拷贝: copy.copy深拷贝: copy...

网友评论

      本文标题:Python——"is" , "==" and "深浅copy"

      本文链接:https://www.haomeiwen.com/subject/aojpjxtx.html