关于指针的理解
Python中的所有变量都是指针,没有类型
每个变量指向一个内存位置,内存由Python管理
当一个内存位置不再有指针指向它的时候,就会被释放
赋值的过程是改变指向的过程
inplace的操作是真正会影响到内存中内容的操作
函数传值传的都是指针
当传入参数的值是基本类型的时候(整数、浮点、布尔),是不会影响到原来的值的,相当于按值传递。而当传入的值不是基本类型的时候,相当于按引用传递,函数内部的操作会影响到原值。
为什么?因为所有变量名都相当于指针,但是基本类型却是不会改变的,1就是1。但是列表、集合和自定义类都可以改变,所以它们相当于按引用传递。
可变对象:list、dict、set、自定义的类型
指向的内存位置不变的同时值可以改变
不可变对象:tuple、string、int、float、bool
值不能改变,只能改变指向的内存位置
AI: bytes 类型是不可变对象。bytes 是按引用传递的,但由于其不可变性,表现得像按值传递。如果需要函数内部修改 bytes 对象的内容,通常需要返回一个新的 bytes 对象。(思考:tuple、string是不是也是这样?C端如果拿到地址是可以修改 bytes 的内容的,某种程度上 bytes 也是可以修改的)
变量作为参数传入函数的时候,是否能在函数中被修改,取决于修改的时候,改变的内存中的内容还是改变指向的位置
函数默认参数一定要设定为不可变参数
深复制和浅复制模块:copy
返回一个潜复制
copy.copy(someData)
返回一个深复制
copy.deepcopy(someData)