1. ==,is的使用
总结:
• is 是比较两个引用是否指向了同一个对象(引用比较)。
• == 是比较两个对象是否相等。
2. 浅拷贝、深拷贝
python中的深拷贝和浅拷贝和java里面的概念是一样的,所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝。
首先,对赋值操作我们要有以下认识:
1.赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 )。
2.修改不可变对象(str、tuple)需要开辟新的空间
3.修改可变对象(list等)不需要开辟新的空间
2.1浅拷贝
浅拷贝是对于一个对象的顶层拷贝,仅仅复制了容器中元素的地址
通俗的理解是:拷贝了引用,并没有拷贝内容
总结:
浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。
2.2 深拷贝
深拷贝是对于一个对象所有层次的拷贝(递归),完全拷贝了一个副本,容器内部元素地址都不一样
总结:
深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。也就是说( 新瓶装新酒 )。
2.3 拷贝的其他方式
浅拷贝对不可变类型和可变类型的copy不同
●对于列表[]来说:
import copy
a = [11,22,33]
b = copy.copy(a)
print(b)
print(id(a),id(b))
a.append(44)
print(a)
print(b)
运行结果:
●对于元组()来说:
import copy
a = (11,22,33)
b = copy.copy(a)
print(b)
print(id(a),id(b))
运行结果:
对字典{}来说:
a=dict(name="zhangsan",age=27)
b=a.copy()
print(b)
print(id(a),id(b))
运行结果:
• 分片表达式可以赋值一个序列
a='abc'
b=a[:]
print(b)
#b='abc'
• 有些内置函数可以生成拷贝(list)
a = list(range(10))
b = list(a)
print(a)
print(b)
print(id(a),id(b))
运行结果: