1.is和==的区别
is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同:
== 是python标准操作符中的比较操作符,用来比较判断两个对象的值是否相等;
例如:
>>> a = '1'
>>> b = 1
>>> c = a
>>> a == b
False
>>> a == c
True
is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同;
例如:
>>> li = li1 = [1,2,3]
>>> li2 = [1,2,3]
>>> id(li)
140670503179616
>>> id(li1)
140670503179616
>>> id(li2)
140670503267000
>>> li == li2
True
>>> li == li1
True
>>> li is li1
True
>>> li is li2
False
>>> li1 is li2
False
练习:
模拟轮盘抽奖游戏:一等奖[0,0.08),二等奖[0.08,0.3),三等奖[0.3,1.0)
1000人参加,模拟游戏时需要准备的各等级奖品的个数
import random
def fun_awd(count):
awd = [0, 0, 0]
for i in range(count):
# 生成0~1之间的随机数如下
num = random.random()
if num > 0 and num < 0.08:
awd[0] += 1
elif num >= 0.08 and num < 0.3:
awd[1] += 1
elif num >= 0.3 and num < 1.0:
awd[2] += 1
else:
print('Error.')
return awd
count = int(input('Please input nums:'))
res = fun_awd(count)
print('First prize:', res[0])
print('Second prize:', res[1])
print('Thired prize:', res[2])
输出结果如下:
2.深拷备和浅拷备
1.可变数据类型和不可变数据类型:
-可变数据类型:当value值发生改变后,id值不发生改变; 列表/字典
-不可变数据类型:当value值改变,id值也改变; 整型/字符串/bool/元组/
2.深拷贝和浅拷贝:
-浅拷贝:在copy库中,使用copy()方法,copy.copy(),浅拷贝有2种情况:
浅拷贝对象是不可变数据类型时,等同于赋值,对象的id值与浅拷贝原来的值相同。
浅拷贝值是可变数据类型时也分为2种情况:
不包含子对象时,浅拷贝是新开辟的一块内存空间,与原对象内存地址不相同,因此原值的改变不影响新值,新值的改变不影响原值;
包含子对象时,拷贝后对象的地址与原对象时不相同的,但是其中子对象的地址与原对象中子对象的地址是相同的,浅拷贝只拷贝子对象以外的值,不会拷贝对象内部的子对象(只是增加一个引用),改变原对象中复杂子对象的值时会改变浅拷贝的值。例如:
a = [1, [4], 2, 3]
b = a
c = copy.copy(a)
id(a) != id(c)
id(a[1]) == id(c[1])
-深拷贝:copy.deepcopy():
在copy不可变数据类型时,深拷贝与浅拷贝效果相同, copy的新对象与原对象地址相同,但是由于是不可变数据类型,因此无论是原对象还是新对象的改变都互相不影响。
在copy可变数据类型时,深拷贝则会拷贝对象及其子对象,深拷贝的时候会将复杂对象的每一层复制一个单独的个体出来,原对象的值改变时并不会影响deepcopy的值
3.python中的赋值:
赋值:并不会创建新的对象,只是为原对象创建了一个新的引用;
则对于可变数据类型.原对象值改变,则新的引用的指向的值也改变;
对于不可变数据类型,原对象值改变.会在内存中创建一个新的对象并赋新的引用,原对象此时与改变后的新对象无关;
赋值举例如下:
# a为不可变数据类型
>>> a = 1
# b为可变数据类型
>>> b = [1]
>>> id(a)
18127976
>>> id(b)
139638226478432
# 将a赋值给c,则c此时也指向对象1,id(c)与id(a)的结果相同
>>> c = a
>>> id(c)
18127976
# 改变c的值,由于c是不可变数据类型,此时会在内存中创建新的对象,id(c)的值改变,c的值改变
>>> c = 2
>>> id(c)
18127952
# 改变b的值,由于b是可变数据类型,此时b的值改变,id(b)的值不变
>>> b.append(2)
>>> id(b)
139638226478432
>>> a
1
>>> b
[1, 2]
>>> c
2
深浅拷贝举例如下:
>>> import copy
>>> a = [11,22]
>>> b = [33,44]
>>> c = (a,b)
>>> id(c[0])
140619313468768
>>> id(a)
140619313468768
# 浅拷贝:
>>> d = copy.copy(c)
>>> d
([11, 22], [33, 44])
>>> id(d[0])
140619313468768
# 当a的值改变,则c,d的值也改变
>>> a.append(55)
>>> a
[11, 22, 55]
>>> c
([11, 22, 55], [33, 44])
>>> d
([11, 22, 55], [33, 44])
>>>
# 深拷贝:
>>> e = copy.deepcopy(c)
>>> e
([11, 22, 55], [33, 44])
>>> id(e[1])
140619313676584
>>> id(d[1])
140619313556152
>>> id(c[1])
140619313556152
>>> id(b)
140619313556152
# 当b的值改变后,深拷贝e的值不改变; d和浅拷贝的值做相应改变
>>> b.append(66)
>>> e
([11, 22, 55], [33, 44])
>>> b
[33, 44, 66]
>>> c
([11, 22, 55], [33, 44, 66])
>>> d
([11, 22, 55], [33, 44, 66])