濮阳市住房和城乡建设局网站,慈溪seo,网络营销方案案例范文,公司商业网站怎么做目录
十四.拆包
列表拆包
元组拆包
集合拆包
字典拆包
经典面试题#xff1a;交换两个变量的值
十五.深浅拷贝
深拷贝
浅拷贝 十四.拆包
引入
拆包#xff1a;是一种快速提取数据的方式
例如#xff0c;有一个元组(11, 22, 33, 44)想快速的提取每个元素且赋值给…目录
十四.拆包
列表拆包
元组拆包
集合拆包
字典拆包
经典面试题交换两个变量的值
十五.深浅拷贝
深拷贝
浅拷贝 十四.拆包
引入
拆包是一种快速提取数据的方式
例如有一个元组(11, 22, 33, 44)想快速的提取每个元素且赋值给num1, num2, num3, num4这4个变量
普通的做法较为繁琐
nums (11, 22, 33, 44) # 定义一个元组
num1 nums[0] # 通过下标来提取
num2 nums[1] # 通过下标来提取
num3 nums[2] # 通过下标来提取
num4 nums[3] # 通过下标来提取
拆包的方式可以见非常简洁
num1, num2, num3, num4 (11, 22, 33, 44) # 一行代码搞定
列表拆包
a, b [11, 22]
print(a)
print(b)
效果
11
22
元组拆包
a, b (11, 22)
print(a)
print(b)
效果
11
22
集合拆包
a, b {11, 22}
print(a)
print(b)
效果
11
22
字典拆包
默认取到的是字典的key而不是value
a, b {name: 小明, age: 18}
print(a)
print(b)
输出
name
age
teacher_info {name: 小明, age: 18}for k, v in teacher_info.items():print(k %s, v %s % (k, v))输出
k name, v 小明
k age, v 18
注意点
在没有使用不定长参数的情况下右边要拆的数据元素的个数要与左边存的变量个数相同
错误示例如下
a, b [11, 22, 33]
运行结果如下
ValueError
Traceback (most recent call last)
ipython-input-19-887c339c8076 in module
---- 1 a, b [11, 22, 33]ValueError: too many values to unpack (expected 2)
使用不定长参数的情况下了解即可
In [1]: int_list [1, 2, 3, 4, 5]In [2]: a, *b, c int_listIn [3]: print(a, b, c)
1 [2, 3, 4] 5经典面试题交换两个变量的值
方式一普通方式
a 4
b 5
print(交换之前a%d, b%d % (a, b))# 额外定义一个变量用来临时使用
c a
a b
b c
print(交换之后a%d, b%d % (a, b))
运行结果
交换之前a4, b5
交换之后a5, b4
方式二巧妙方式
a 4
b 5
print(交换之前a%d, b%d % (a, b))# 巧妙之处没有用额外的变量
a ab
b a-b
a a-b
print(交换之后a%d, b%d % (a, b))
运行结果
交换之前a4, b5
交换之后a5, b4
方式三拆包方式
a 4
b 5
print(交换之前a%d, b%d % (a, b))a, b b, a
print(交换之后a%d, b%d % (a, b))
执行结果
交换之前a4, b5
交换之后a5, b4
说明
a, b b, a首先要计算右边b, a此时他们会被当做一个元组即(b, a)就相当于(5, 4)然后再将a, b (5, 4)进行计算此时a为5b为4
十五.深浅拷贝
深拷贝和浅拷贝需要注意的地方就是可变元素的拷贝
在浅拷贝时拷贝出来的新对象的地址和原对象是不一样的但是新对象里面的可变元素如列表的地址和原对象里的可变元素的地址是相同的也就是说浅拷贝它拷贝的是浅层次的数据结构不可变元素对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去而是和原对象里的可变元素指向同一个地址所以在新对象或原对象里对这个可变元素做修改时两个对象是同时改变的但是深拷贝不会这样这个是浅拷贝相对于深拷贝最根本的区别。
也可以这样理解
深拷贝就是完全跟以前就没有任何关系了原来的对象怎么改都不会影响当前对象浅拷贝时原对象的list元素改变的话会改变当前对象如果当前对象中list元素改变了也同样会影响原对象
深拷贝
克隆一份修改拷贝后的对象中的可变元素不对原对象内容产生影响
copy模块中的deepcopy()
import copylist1 [[张三, 李四], 王五, 赵六, 钱七]
list2 copy.deepcopy(list1) # 进行深拷贝# 打印 list1 和 list2 两个列表的内存地址 结果不一样
print(id(list1)) # 3132367069640
print(id(list2)) # 3132368415752# 打印 list1 和 list2 两个列表中的子列表的内存地址 结果不一样
print(id(list1[0])) # 3132368414728
print(id(list2[0])) # 3132368415688list2[0][0] 安娜# 结果 list2 列表修改了但是不影响list1列表数据
print(list2) # [[安娜, 李四], 王五, 赵六, 钱七]
print(list1) # [[张三, 李四], 王五, 赵六, 钱七]
浅拷贝
修改拷贝后的内容中的可变数据原对象内容随之修改
列表函数copy()进行浅拷贝
list1 [[张三, 李四], 王五, 赵六, 钱七]
list2 list1.copy() # 进行浅拷贝# 打印 list1 和 list2 两个列表的内存地址 结果不一样
print(id(list1)) # 2105959073864
print(id(list2)) # 2105989035464print(- * 30)# 打印 list1 和 list2 两个列表中的子列表的内存地址 结果一样
print(id(list1[0])) # 2105989035592
print(id(list2[0])) # 2105989035592list2[0][0] 安娜# 结果list2列表修改了list1列表数据也修改了
print(list2) # [[安娜, 李四], 王五, 赵六, 钱七]
print(list1) # [[安娜, 李四], 王五, 赵六, 钱七]
copy模块中的copy()方法
import copylist1 [[张三, 李四], 王五, 赵六, 钱七]
list2 copy.copy(list1) # 进行浅拷贝# 打印 list1 和 list2 两个列表的内存地址 结果不一样
print(id(list1)) # 2105959073864
print(id(list2)) # 2105989035464print(- * 30)# 打印 list1 和 list2 两个列表中的子列表的内存地址 结果一样
print(id(list1[0]))
print(id(list2[0]))list2[0][0] 安娜# 结果list2列表修改了list1列表数据也修改了
print(list2) # [[安娜, 李四], 王五, 赵六, 钱七]
print(list1) # [[安娜, 李四], 王五, 赵六, 钱七]
# 现有女警司有额度为200000元的信用卡卡号为20200520已使用的额度15000
# 现需要实现曹达华也需要绑定这张信用卡进行付款card [女警司, 20200520, [200000, 15000]] # 女警司名下的信用卡c_card card.copy() # 曹达华账户也开了一张绑定女警司信用卡的信用卡且修改姓名和卡号
c_card[0] 曹达华
c_card[1] 20200521
print(c_card) # 打印出曹达华的信用卡信息 [曹达华, 20200521, [200000, 15000]]card[2][1] 2000 # 此时女警司使用了信用卡且刷了2000元print(c_card) # 此时曹达华的信用卡额度也随之变化# 运行结果如下
# [曹达华, 20200521, [200000, 15000]]
# [曹达华, 20200521, [200000, 17000]] # 女警司刷卡后曹达华所持的信用卡已使用的额度随之增长