id 和 ==

is 用于判断两个变量引用对象是否为同一个,就是所引用的对象的内存地址是否一致
== 用于判断引用变量的值是否相等。只判断值和数据类型

>>> a = 1
>>> b = 1           变量a 和变量 b 引用同一个对象
>>> id(a)         
20073576
>>> id(b)
20073576           使用id() 查看变量引用的对象的内存地址,a和b一致
>>> type(a)
<type 'int'>
>>> type(b)
<type 'int'>       数据类型也是相同的
>>> a is b          
True
>>> a  == b            所引用的变量相等所以就是True
True
>>> a = '1'           
>>> b = 1             
>>> type(a)
<type 'str'>
>>> type(b)           
<type 'int'>             引用的变量有所不同,一个是字符串类型的,一个是int整数型的
>>> a  is  b
False
>>> a  == b
False          所以两个是不想等的 就是False
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> type(a)
<type 'list'>
>>> type(b)
<type 'list'>           数据类型相等,都是列表
>>> id(a)
140374326326408
>>> id(b)
140374326413792            所指向的内存地址不同
>>> a is b             导致a is b 返回的是 False
False
>>> a == b         因为两个变量的数值和类型都相同所以返回的就是True
True
copy和deepcopy
copy:浅拷贝
deepcopy:深拷贝
1 当被复制的对象完全是不可变数据类型的时候,两者效果相同,都是引用。新生成的变量引用的对象与之前的变量完全一致:
import copy       
x = 1
y = (2,3,4)
a = (x,y)
b = copy.copy(a)                  b对a的浅拷贝
c = copy.deepcopy(a)         c对a的深拷贝
print(a,type(a),id(a),id(a[1]))         输出a,a的类型及其他的内存地址对比查看情况
print(b,type(b),id(b),id(b[1]))         
print(c,type(c),id(c),id(c[1]))

实验效果

(1, (2, 3, 4)) <class 'tuple'> 140124916856648 140124916753176
(1, (2, 3, 4)) <class 'tuple'> 140124916856648 140124916753176
(1, (2, 3, 4)) <class 'tuple'> 140124916856648 140124916753176
如果拷贝的是一个拥有可变类型的数据,那么deepcopy依然是深拷贝,copy是浅拷贝
2 当被复制的外层父对象是不可变数据类型,里面子对象是可变数据类型的时候:

浅拷贝:完全的引用,新生成的变量完全引用了原来变量所引用的父对象以及子对象
深拷贝:生成新的父对象以及子对象,新的变量引用新生成的父对象和子对象

import copy
x = 1
li = [2,4,6]
a = (x,li)   # 外层父对象不可变,内层子对象可变
b = copy.deepcopy(a)   # 深拷贝
c = copy.copy(a)  # 浅拷贝
print(a,type(a),id(a),id(a[1]))    
print(b,type(b),id(b),id(b[1]))  
print(c,type(c),id(c),id(c[1]))

效果演示

(1, [2, 4, 6]) <class 'tuple'> 140115481012040 140115360539592
(1, [2, 4, 6]) <class 'tuple'> 140115481012488 140115360541064
(1, [2, 4, 6]) <class 'tuple'> 140115481012040 140115360539592

3 当被复制的外层父对象是可变数据类型,里面子对象是不可变数据类型的时候:
不论是深拷贝还是浅拷贝,都生成新的父对象,引用原来的子对象

import copy
x = 1
li = (2,4,6)
a = [x,li]   # 外层父对象是可变数据类型,内层子对象是不可变数据类型
b = copy.deepcopy(a)
c = copy.copy(a)
print(a,type(a),id(a),id(a[1]))
print(b,type(b),id(b),id(b[1]))   # 输出深拷贝的数据信息
print(c,type(c),id(c),id(c[1]))    # 输出浅拷贝的数据信息

效果展示

[1, (2, 4, 6)] <class 'list'> 139881985471432 139882105840336
[1, (2, 4, 6)] <class 'list'> 139881985471624 139882105840336
[1, (2, 4, 6)] <class 'list'> 139881985472904 139882105840336
4 当被复制的外层父对象是可变数据类型,里面子对象是可变数据类型的时候
import copy
x = 1
li = [2,4,6]
a = [x,li]   # 父对象和子对象都是可变的数据类型
b = copy.deepcopy(a)
c = copy.copy(a)
print(a,type(a),id(a),id(a[1]))
print(b,type(b),id(b),id(b[1]))
print(c,type(c),id(c),id(c[1]))

效果展示

[1, [2, 4, 6]] <class 'list'> 139784093750408 139784093750216
[1, [2, 4, 6]] <class 'list'> 139784093751688 139784093751624
# 深拷贝的时候,新生成父对象和子对象,新变量引用新生成的父对象以及子对象
[1, [2, 4, 6]] <class 'list'> 139784093751560 139784093750216
#浅拷贝的时候,生成新的父对象,引用原来的子对象