python踩坑记-引用与赋值

引用与赋值

在python中的赋值,实际上都是引用,内在的含义就是用一个标签指向这个内存空间

a = 10

这个语句在执行的时候实际上是先在内存空间中创建一个10,然后将a这个标签指向这个内存空间,因此这才是完整的引用操作

python中所有的赋值操作都是引用,而不是复制这个内存空间创建一个新的空间来存放这个值

浅拷贝和深拷贝

因为存在引用的关系,那么数据类型可以分为不可变的数据类型和可变的数据类型,基础数据类型都是不可变的数据类型,因此数字,字符串等都是不可变的,python中的元组也是不可变的数据类型,但是元组里面的内容如果是可变类型则还是可以变

元组,列表很像,那么元组和列表都存在索引,这就会存在根据索引取值的操作,那么问题就来了,列表和元组里面存放的到底是值还是指向这个值的引用

实际上不管是列表还是元组,列表内部存放的全是引用,引用这个方式就像是贴标签一样,内存就像是一个盒子,里面存放着具体的值,列表和元组存放着这些标签

元组的不可更改意味着这些标签不能被更改,如果标签直接指向的是内存,那么确实没有办法改动,但是如果标签指向的是另外一个标签,这种指向确实没有办法变动,但是另外一个标签指向的是一个可变类型的话那么就意味着指向的值发生变动,这并不违背元组不可变的方式

a = (1,2,3,[4,5,6])
a[3][0] = 'a'
print(a)

这就可以变动

那么拷贝动作本身而言是复制值,但是如果值本身指向的是另外一个引用,这就会导致copy复制的只是一个引用,如果引用的值发生变化,还是会影响到复制后的值,解决这个问题就是使用深复制deepcopy,这个方法就能够进行类似递归方式的将引用的引用也复制到位,只要是deepcopy,那就不会出现错乱的情况

new = []
a = {'name': 0}
for i in range(10):
    a['name'] = i
    new.append(a)
print(new)

结果实际上上有点尴尬

字典的key实际上就像一个标签,列表里面存放的其实也是标签,这才是这个输出错误的原因,字典的赋值操作实际上就是把标签撕下来贴到新的内存盒子上,而循环的时候每次的i都不同,实际上每次都去贴新盒子,但是append每次都将标签追加到列表中,而列表里面存放的全是同一个标签,这就很尴尬了,大家都指向的是同一个值,最后变量完成,大家都指向了值为9的内存空间,所以最后的结果是:

[{'name': 9}, {'name': 9}, {'name': 9}, {'name': 9}, {'name': 9}, {'name': 9}, {'name': 9}, {'name': 9}, {'name': 9}, {'name': 9}]

函数的引用

在定义函数的时候函数存在形参和实参,当我们外部传递给函数的到底是一个值还是一个引用?

实际上我们经常的操作是传递给函数某个变量,而变量本身其实是引用,变量并不是值

初学的时候我也有这样的疑问,有的函数存在返回值,有的函数没有返回值,有的函数没有返回值,有的函数对原来的输入数据就地修改,有的函数并不修改原数据而是返回的新值

a = [10,9,10,20,31,0]
def function(a):
    b = a
    b.sort()
    return b
print(a)
print(function(a))
print(a)

结果:

[10, 9, 10, 20, 31, 0]
[0, 9, 10, 10, 20, 31]
[0, 9, 10, 10, 20, 31]

这就很尴尬了,为啥最后一个a的值被修改了,这就要说说函数传参到底传了啥子玩意

实际上当函数发生调用的时候表明上看起来传入的是a,感觉好像是传进去了一个列表,实际上传进去的只是引用,这个引用直接指向a指向的空间,而a指向的是一个列表空间

函数内部b=a看起来是赋值,赋值都是引用,sort函数直接是对b这个引用进行操作,但是b本身只是一个标签,所以操作对象又去找b指向的地方,找到了a,a在函数内部实际上是传入的参数,从外面传入的本身就是一个引用,引用是没有sort方法的,因此又继续找,好了,a这个引用指向的是一个列表空间,那就对了,列表空间存在sort方法,因此直接使用sort进行对列表空间的排序,而sort方法本身是直接就地修改,这就很坑,相当于直接对这个指向的空间进行修改,这个空间上的引用实际上不止是函数中的参数在引用,函数外的a变量也在引用

那么a在函数执行完成之后还是指向的这个列表空间,好了,瞬间GG,虽然外面a没有变化,实际上空间内的数据已经发生变动,打印出来的a也会呈现新的表现形式

猜你喜欢

转载自blog.csdn.net/weixin_43959953/article/details/86249452