Python学习之Part07. is & == 和 深拷贝 & 浅拷贝

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])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值