python可变不可变类型与go的值类型与引用类型

python可变不可变与go的值类型与引用类型对比

python 可变与不可变类型

在python中,有一句话叫做一切皆对象,一切皆引用,因此在python中,其实不存在真正意义上的基础数据类型,无论是列表,字符串,数值类型,实际上都是一个个类所产生的对象。这也是为什么python中 整型 没有长度限制,能够无限大的原因。

也正因为python中一切皆对象,python 底层存储值的方式,都是 变量名 -> 内存地址,内存地址-> 数据,这种引用传递的方式。

在这里插入图片描述

如果python没有做任何处理,按理来说,不管是列表还是数字,字符串,修改值时,内存地址应该都是不变的。但是仅有集合,列表,字典三种类型数据修改值而内存地址不改变的数据类型,在python中称为可变类型

在这里插入图片描述

但是,实际上,如果在python中如果修改的是 数值,字符串,元组,布尔类型的数据,值改变,内存地址也会跟着变,这一类在python中称之为不可变类型数据

在这里插入图片描述

这一点,可以在函数传参中,可以更加清楚的看出来,可变类型传入,在函数内部名称空内修改,全局的数据也会跟着修改,但是不可变类型,在内部空间修改,却不会影响到全局变量

所以,其实在python中,这就很古怪,因此真正明白的人,都不会去说python函数传参是引用传递,还是值传递,而是讲的是一切皆引用,因此python作者才分出来可变与不可变类型。所以看到这,你就是明白人了

go 的值类型与引用类型

而在go中,两者就有很好的区分。go中的数据类型可以分为值类型和引用类型两大块

值类型包括: 所有的整型、浮点型、bool型、string型、数组和struct类型

值类型的特点是变量直接存储值,内存通常在 栈(stack) 中分配

引用类型包括: 指正、slice、map、chan、interface

引用类型的特点,变量存储的是一个地址,这个地址对应的空间才真正存储的数据,内存分配通常在 堆(heap) 上分配,当没有任何变量引用这个地址的时候,该地址对应的数据空间会被GC回收 -> 这点和 python 不能说是一模一样,只能说是 别无二样

go语言中的参数传递是 copy传递,把变量赋值一份给函数,值类型,传入函数,修改后,不会影响原来的值,引用类型,复制这个引用,传入(指向没变)函数,修改后,会影响原来的值

补充: 不论是在go中还是在python中,函数都是一等公民,能够直接当做变量值传递给变量名。也可以当做函数参数使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go&Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值