2022.08.08 DAY23
1. 函数的用法和底层分析
1. 参数的传递
-
Python中参数的传递都是“引用传递”。
-
具体操作可分为两类:
- 对“可变对象”进行“写操作”,直接作用域原对象本身。
- 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。
-
可变对象有:
- 字典、列表、集合、自定义对象等
-
不可变对象有:
- 数字、字符串、元组、function等
2.传递不可变对象的引用
- 传递参数是不可变对象,实际传递还是对象的引用。在“复制操作”中,由于不可变对象无法修改,系统会新创建一个对象。
3. 浅拷贝与深拷贝
- 内置函数copy(浅拷贝)、deepcopy(深拷贝)
- 浅拷贝:不拷贝子对象的内容,只拷贝子对象的引用。
- 深拷贝:会连子对象的内容全部拷贝一份,对子对象的修改不会影响源对象。
浅拷贝示例代码:
import copy
a_list = [20, 50, [5, 6]]
b_list = copy.copy(a_list)
def test():
print("a : ", a_list)
print("b : ", b_list)
b_list.append(100)
b_list[2].append(200)
print("浅拷贝...")
print("a : ", a_list)
print("b : ", b_list)
if __name__ == '__main__':
test()
运行结果:
a : [20, 50, [5, 6]]
b : [20, 50, [5, 6]]
浅拷贝...
a : [20, 50, [5, 6, 200]]
b : [20, 50, [5, 6, 200], 100]
深拷贝示例代码:
import copy
def test_deepcopy():
a_list = [20, 50, [5, 6]]
b_list = copy.deepcopy(a_list)
print("a : ", a_list)
print("b : ", b_list)
b_list.append(100)
b_list[2].append(200)
print("深拷贝...")
print("a : ", a_list)
print("b : ", b_list)
if __name__ == '__main__':
test_deepcopy()
运行结果:
a : [20, 50, [5, 6]]
b : [20, 50, [5, 6]]
深拷贝...
a : [20, 50, [5, 6]]
b : [20, 50, [5, 6, 200], 100]
3.不可变对象含可变子对象
- 传递不可变对象(数字、字符串、元组、function)时,不可变对象里包含的子对象是可变的,则方法内修改了这个可变对象,源对象也发生了变化。
4.参数的几种类型
-
位置参数
- 函数调用时,实参默认按照顺序传递,需要个数和形参匹配。
-
默认值参数
- 参数设置默认值,这样的参数在传递时就是可选的。
- 默认值参数放在位置参数的后面。
-
命名参数
- 可以按照形参的名称传递参数。
-
可变参数
- 可变数量的参数
- *param 将多个参数收集到一个“元组”对象中。
- **param 将多个参数收集到一个“字典”对象中。
-
强制命名参数
- 可变参数后面新增新的参数,必须是“强制命名参数”。