文章目录
Python知识盲点(二)
1.深拷贝,浅拷贝
浅拷贝:不拷贝子对象的内容,只是拷贝子对象的引用。
深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象
1.1浅拷贝
import copy
a = [10,20,[5,6]]
b=copy.copy(a)
print("a:",a) # a:[10,20,[5,6]]
print("b:",b) # b:[10,20,[5,6]]
b.append(30)
b[2].append(7)
print("a:",a) # a:[10,20,[5,6,7]]
print("b:",b) # b:[10,20,[5,6,7],30]
1.2深拷贝
import copy
a = [10,20,[5,6]]
b=copy.deepcopy(a)
print("a:",a) # a:[10,20,[5,6]]
print("b:",b) # b:[10,20,[5,6]]
b.append(30)
b[2].append(7)
print("a:",a) # a:[10,20,[5,6]]
print("b:",b) # b:[10,20,[5,6,7],30]
# 即:a完全没变
2.参数
2.1 传递不可变对象是浅拷贝
传递int,float ,字符串,元组,布尔值的时候,实际上传递的是对象的引用。在对这些参数进行写操作的时候,会创建一个新的对象拷贝
2.2 位置参数
即:最常见的那种
2.3 默认值参数
def f(a,b,c=10):
print(a,b,c)
f(8,9)
2.4命名参数
def f(a,b,c):
print(a,b,c)
f(c=10,a=20,b=30) # 20,30,10
2.5 可变参数
- *param,将多个参数收集到一个“元组”对象中
- **param,将多个参数收集到一个字典对象中
2.6强制命名参数
在带星号的“可变参数”后面,增加新的参数,必须是“强制命名参数”
def f(*a, b, c):
print(a,b,c)
# f(2,3,4) #会报错,因为a是可变参数,那么2,3,4这三个该如何组成列表传给a是不确定的
f(2,b=3,c=4) # (2,)34
3.lambda表达式和匿名函数
3.1 lambda基本语法
lambda arg1,arg2,arg3……:<函数体>
arg1, arg2,arg3为函数的参数,<表达式>相当于函数体
f = lambda a,b,c:a+b+c
print(f) # <function <lambda> at 0x0000……>
printf(f(2,3,4)) # 9
g = [lambda a:a*2, lambda b:b*3, lambda c:c*4]
print(g[0](6),g[1](7),g[2](8)) # 12 21 32
4.eval()函数
功能:将字符串str当成有效的表达式来求值,并返回计算结果
语法:eval(source[, globals[, locals]]) ->value
参数:
- source: 一个Python表达式或函数compile()返回的代码对象
- globals: 可选,必须是字典
- locals: 可选,任意的映射对象
s = "print("abcdefg")"
eval(s) # abcdefg
a = 10
b = 20
c = eval("a+b")
print(c) # 30
dict1 = dict(a=100,b=200)
d = eval("a+b",dict1)
print(d) # 300
5.nonlocal, global关键字
nonlocal: 用来声明外层的局部变量
global: 用来声明全局变量
a = 100
def outer():
b = 10 #(1)
def inner():
nonlocal b # 声明外部函数的局部变量,即(1)处的b可以作用在inner里
print("inner b:",b)
b = 20
global a # 声明全局变量,即首行的a可以作用于这里
a = 1000
inner()
print("outer b:",b)
outer()
print("a:",a)
'''
输出结果:
inner b:10
outer b:20
a:1000
'''