且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

列表推导式的使用与练习 | 手把手教你入门Python之三十五

更新时间:2022-02-28 10:13:33

上一篇:列表嵌套 | 手把手教你入门Python之三十四
下一篇:元组的基本使用和字典的增删改查 | 手把手教你入门Python之三十六

本文来自于千锋教育在阿里云开发者社区学习中心上线课程《Python入门2020最新大课》,主讲人姜伟。

列表推导式

所谓的列表推导式,就是指的轻量级循环创建列表

1. 基本的⽅式

列表推导式的使用与练习 | 手把手教你入门Python之三十五

2. 在循环的过程中使⽤if

列表推导式的使用与练习 | 手把手教你入门Python之三十五

3. 2个for循环

列表推导式的使用与练习 | 手把手教你入门Python之三十五

4. 3个for循环

列表推导式的使用与练习 | 手把手教你入门Python之三十五

列表推导式的使用与练习 | 手把手教你入门Python之三十五

练习

请写出⼀段 Python 代码实现分组⼀个 list ⾥⾯的元素,⽐如 [1,2,3,...100]变成 [[1,2,3],[4,5,6]....]
参考答案:

a = [x for x in range(1,101)]
b = [a[x:x+3] for x in range(0,len(a),3)]

练习参考

列表推导式的使用与练习 | 手把手教你入门Python之三十五

列表的复制

查看以下代码,说出打印的结果。

a = 12
b = a
b = 13
print(b)
print(a)
nums1 = [1, 5, 8, 9, 10, 12]
nums2 = nums1
nums2[0] = 100
print(nums2)
print(nums1)

思考:

  1. 为什么修改了 nums2⾥的数据,nums1的数据也会改变?
    Python中的赋值运算都是引⽤(即内存地址)的传递。对于可变类型来说,修改原数据的值,会改变赋值

对象的值。

  1. 怎样nums1和nums2变成两个相互独⽴不受影响的列表?
    使⽤列表的 copy ⽅法,或者 copy 模块就可以赋值一个列表。

列表的copy⽅法

使⽤列表的copy⽅法,可以直接将原来的列表进⾏复制,变成⼀个新的列表,这种复制⽅式是浅复制。

nums1 = [1, 5, 8, 9, 10, 12]
nums2 = nums1.copy() # 调⽤列表的copy⽅法,可以复制出⼀个新的列表
nums2[0] = 100
# 修改新列表⾥的数据,不会影响到原有列表⾥的数据
print(nums2)
print(nums1)

copy模块的使⽤

除了使⽤列表的copy⽅法以外,Python还提供了copy模块来复制⼀个对象。copy模块提供了浅复制和深复制两种⽅式,它们的使⽤⽅式相同,但是执⾏的效果有⼀定的差异。

浅拷⻉

浅拷⻉是对于⼀个对象的顶层拷⻉,通俗的理解是:拷⻉了引⽤,并没有拷⻉内容。

import copy
words1 = ['hello', 'good', ['yes', 'ok'], 'bad']
# 浅拷⻉只会拷⻉最外层的对象,⾥⾯的数据不会拷⻉,⽽是直接指向
words2 = copy.copy(words1)
words2[0] = '你好'
words2[2][0] = 'no'
print(words1) # ['hello', 'good', ['no', 'ok'], 'bad']
# wrods2 ⾥的 yes 被修改成了 no
print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']

列表推导式的使用与练习 | 手把手教你入门Python之三十五

深拷⻉

深拷⻉是对于⼀个对象所有层次的递归拷⻉。

import copy
words1 = ['hello', 'good', ['yes', 'ok'], 'bad']
# 深拷⻉会将对象⾥的所有数据都进⾏拷⻉
words2 = copy.deepcopy(words1)
words2[0] = '你好'
words2[2][0] = 'no'
print(words1) # ['hello', 'good', ['yes', 'ok'], 'bad']
print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']

列表推导式的使用与练习 | 手把手教你入门Python之三十五
列表推导式的使用与练习 | 手把手教你入门Python之三十五

切⽚

列表和字符串⼀样,也⽀持切⽚,切⽚其实就是⼀种浅拷⻉。

words1 = ['hello', 'good', ['yes', 'ok'], 'bad']
words2 = words1[:]
words2[0] = '你好'
words2[2][0] = 'no'
print(words1) # ['hello', 'good', ['no', 'ok'], 'bad']
print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']