1. 深拷贝和浅拷贝
定义
浅拷贝:不拷贝子对象的内容,只拷贝子对象的引用;
深拷贝:将子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象。
工具
copy模块的copy(浅拷贝)、deepcopy(深拷贝)。
例:
浅拷贝:
a = [10, 20, [5, 6]]
b = copy.copy(a)
print("a:", a)
print("b:", b)
b.append(30)
b[2].append(7)
print("浅拷贝后……")
print("b:", b) # b: [10, 20, [5, 6, 7], 30]
print("a:", a) # a: [10, 20, [5, 6, 7]]
分析:
深拷贝:
a = [10, 20, [5, 6]]
b = copy.deepcopy(a)
print("a:", a)
print("b:", b)
b.append(30)
b[2].append(7)
print("深拷贝后……")
print("b:", b) # b: [10, 20, [5, 6, 7], 30]
print("a:", a) # a: [10, 20, [5, 6]]
分析:
2. 函数中参数的传递
python中一切皆对象,所有的赋值操作都是引用的赋值,所以python中参数的传递都是引用传递。
a = 6
b = a
print(b) # 6
a = 8
print(b) # 6
a = [6, 8] # 列表是可变的
b = a
print(b) # [6, 8]
a.append(10)
print(b) # [6, 8, 10]
- 传递的参数是可变对象(字典、列表、集合等)。对可变对象进行“写操作”,直接作用于对象本身,在函数体中不创建新的拷贝。
a = [6, 8]
print(id(a)) # 2383737429448
def test(m):
m.append(10)
print("m:", m, id(m)) # m: [6, 8, 10] 2383737429448
if __name__ == '__main__':
test(a)~
- 传递的参数是不可变对象(数字、元组、字符串等),在”赋值操作”时,由于不可变对象无法修改,系统会新创建一个对象(开辟新内存空间)。
def test(m):
m = m + 1
print("m:", m, id(m))
if __name__ == '__main__':
a = 1
print(id(a))
test(a)
print("a:", a, id(a))
运行结果:
- 传递的不可变对象的子对象是可变对象:
def test(m):
m[2].append(6)
print("m:", m, id(m))
if __name__ == '__main__':
a = (3, 9, [6, 8])
print(id(a))
test(a)
print("a:", a, id(a))
运行结果:
3. lambda表达式和匿名函数
- lambda(λ)表达式可以用来声明匿名函数。lambda函数是一种简单的、在同一行中定义函数的方法,实际生成了一个函数对象。
- lambda表达式只允许包含一个表达式,不能包含复杂语句,该表达式的计算结果就是函数的返回值。
- lambda表达式的基本语法:
lambda arg1,arg2,…… :表达式
f = lambda a, b, c: a+b+c
print(f(2, 3, 4)) # 9
g = [lambda a:a*2, lambda b:b*3, lambda c:c**2]
print(g[2](3)) # 9
4. 嵌套列表整合成一个列表
a = [[1, 2, 3], [4, 7, 8]]
b = [i for j in a for i in j]
print(b) # [1, 2, 3, 4, 7, 8]
import numpy as np
a = np.array([[4,5,6],[7,8,9]])
print(a)
b = [i for j in a for i in j]
print(b)
运行结果:
5. pycharm中的查找替换
- ctrl+shift+f:全局查找;
ctrl+shift+r: 全局替换 - 安装vim插件后进入可视模式:
:%s/旧文本/新文本/g
:2,6 s/旧文本/新文本/g (第二行到第六行或选中几行)
拜师教育学员文章:作者:1191-杨同学,
转载或复制请以 超链接形式 并注明出处 拜师资源博客。
原文地址:《python基础—深浅拷贝、函数中参数传递、lambda表达式、嵌套列表整合成一个列表、pycharm中的查找替换》 发布于2020-08-05
评论 抢沙发