Python中的拷贝与判断

1.Python中拷贝分为浅拷贝与深拷贝

简单来说:深拷贝就是把要拷贝的对象整体复制一份,存在新开辟的空间里;
	而浅拷贝指的是,对于要拷贝的对象要复制一份,但是对于其内部的子对象就不复制了,
	而是直接引用,也就是类似于添加了一个链接而已。
虽然两者表面效果差不多,但是内层却大不相同。
面试常问:请简述赋值, 深拷贝和浅拷贝的区别?(python中如何拷贝一个对象?)
  • 直接赋值li1  =  li  ): 只传递对象的引用, li1指向对象li的内存地址空间,

         因此, 原有列表li改变, 被赋值的li1也会做相应的改变.

  • 浅拷贝(三种实现方式( ) eg: li2 = li.copy( ) ):li和li2的内存地址不同,

        但是子对象的内存地址相同, 因此,原始数据改变 , 子对象也改变.

  • 深拷贝(import copy, eg: li3=copy.deepcopy(li)), li和li3的内存地址不同,

         包含子对象的拷贝, 所以原始对象改变并不会造成深拷贝里面任何子项的改变.

 

以下对上述情况进行一一验证:

直接赋值:

a = [1,2,3]
id(a)
140526875481608
b = a
id(b)
140526875481608
a.append(8)
a
[1, 2, 3, 8]
b
[1, 2, 3, 8]

浅拷贝

- li.copy(  )
- li [ : ]
- copy.copy( li )

a = [['z','x'],5,6]
b = a[:]
c = a.copy()
id(a),id(b),id(c)
(140526894578120, 140526901551752, 140526901552392)
a.append(4)
a,b,c
([['z', 'x'], 5, 6, 4], [['z', 'x'], 5, 6], [['z', 'x'], 5, 6])
a[0].append("y")
a,b,c
([['z', 'x', 'y'], 5, 6, 4], [['z', 'x', 'y'], 5, 6], [['z', 'x', 'y'], 5, 6])

深拷贝

导入copy函数,使用copy.deepcopy( )作为深拷贝

但此函数中的copy.copy( )为浅拷贝

  • copy.copy( )
    import copy
    a = [['z','x'],5,6]
    d = copy.copy(a)
    id(a),id(d)
    print(a,d)
    a.append(4)
    print(a,d)
    a[0].append("r")
    print(a,d)

  • copy.deepcopy( )
import copy
a = [['z','x'],5,6]
d = copy.deepcopy(a)
id(a),id(d)
print(a,d)
a.append(4)
print(a,d)
a[0].append("r")
print(a,d)

2.is和==的区别

变量:
          id: 在内存中存储的位置;id(a)
          value: ==
          type:变量的数据类型; type(a)

==  :   value, type
is    :   三个都判断

a = [1,2,3]
a = "1"
b = a
id(a),id(b)
(140526944818432, 140526944818432)
a == b ,a is b
(True, True)

a = [1,2,3]
b = [1,2,3]
id(a),id(b)
(140526875595976, 140526939868424)
a == b , a is b
(True, False)

猜你喜欢

转载自blog.csdn.net/weixin_41179709/article/details/81635861
今日推荐