Python 可变类型和不可变类型及引用过程解析

 更新时间:2019年09月27日 08:28:19   作者:tony86  
这篇文章主要介绍了Python 可变类型和不可变类型,以及其引用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在Python中定义一个数据便在内存中开辟一片空间来存储这个变量的值,这块已经被分配的内存空间便会有一个内存地址。访问这块内存需要用到变量名,变量名实际存储的是变量的地址在内存中的地址,但是使用print()函数得到的确实这块内存中实际的地址。这个就当成规定就好,没必要纠结。

获得变量在内存中的地址,可以使用id()函数。

常规使用

变量之间的赋值其实是把一个变量的内存地址传递给另一个变量,这样两个变量便都指向内存中的同一块空间,因此这两个变量的之是相等的

a = 1
b = a
print("a:%d  b:%d" % (a,b))
print(id(a))
print(id(b))
结果:
a:1  b:1
1711072016

此时如果有第三个变量c的值与a的相等,那么c的地址与a的地址一样。这一点请大家牢记。

a = 1
c = 1
print("a:%d  c:%d" % (a,c))
print(id(a))
print(id(c))
结果:
a:1  c:1
1711072016

此时如果修改变量c的值,那么会在内存中新开辟一块内存来存储这个变量,这块新的内存地址将会赋值给c。

a = 1
c = 1
c = 2
print("a:%d  c:%d" % (a,c))
print(id(a))
print(id(c))
结果:
a:1  c:2
1711072032

基本数据类型作为函数参数

基本数据类型作为函数实参同样是这个道理。

a = 1
print(id(a))
def func(x):
  print(id(x))
  x = 2
  print(id(x))
 
func(a)
结果:
1711072016

列表、字典等高级数据类型的引用

列表字典等高级数据类型的变量名同样存储的变量的实际地址,一个列表名赋值给另一个变量,那么这两个变量便指向内存中的同一块地址。

list1 = [1,2,3]
list2 = list1
print(list1,list2)
print(id(list1),id(list2))
结果:
[1, 2, 3] [1, 2, 3]
57931896

高级数据类型在每集加载进内存的时候内存地址与上一次可能会不同。

此时如果修改list2,也会影响list1的值,但是两个变量在内存中的地址还是不变的。这一点是与基本数据类型不一样的。

list1 = [1,2,3]
list2 = list1
print(list1,list2)
print(id(list1),id(list2))
list2.append(4)
print(list1,list2)
print(id(list1),id(list2))
 
结果:
[1, 2, 3] [1, 2, 3]
43841656
[1, 2, 3, 4] [1, 2, 3, 4]
43841656

此时如果有第三个列表list3的值也是[1,2,3,4],可以推测list3的地址与list1的地址应该是一样的,但是事实并非如此。如果有第三个列表list3的值也是[1,2,3,4],相当于在内存中新开辟一块内存来存储这个值。

list1 = [1,2,3]
list2 = list1
list3 = [1,2,3]
print(list1,list2,list3)
print(id(list1),id(list2),id(list3))
结果:
[1, 2, 3] [1, 2, 3] [1, 2, 3]
16775288 16776768

可变数据类型与不可变数据类型

在python中哪些是可变数据类型,哪些是不可变数据类型。可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。

用一句话来概括上述过程就是:“python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • python中super()函数的理解与基本使用

    python中super()函数的理解与基本使用

    super( )函数是用来调用父类的一个方法,super( )函数还用来解决多重继承的问题,下面这篇文章主要给大家介绍了关于python中super()函数的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • pip search报错问题及解决

    pip search报错问题及解决

    这篇文章主要介绍了pip search报错问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Python pyecharts Map地图数据不显示的原因及完美解决

    Python pyecharts Map地图数据不显示的原因及完美解决

    这篇文章主要给大家介绍了关于Python pyecharts Map地图数据不显示的原因及解决办法,pyecharts是一款将python与echarts结合的强大的数据可视化工具,文中通过图文以及代码示例介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Python压缩解压缩zip文件及破解zip文件密码的方法

    Python压缩解压缩zip文件及破解zip文件密码的方法

    这篇文章主要介绍了Python压缩解压缩zip文件及尝试破解zip文件密码的方法,给出了一个使用zipfile模块的简单示例,需要的朋友可以参考下
    2015-11-11
  • Python代码风格与编程习惯重要吗?

    Python代码风格与编程习惯重要吗?

    实现高内聚,低耦合、结构清晰不臃肿、可读性高、数据冗余性低、高复用、易扩展的代码,并非易事.上到设计模式,下到某个类、方法、函数的构造.在这里我分享一下我自己的代码设计,编写风格,让我们互相学习,需要的朋友可以参考下
    2021-06-06
  • python中计算一个列表中连续相同的元素个数方法

    python中计算一个列表中连续相同的元素个数方法

    今天小编就为大家分享一篇python中计算一个列表中连续相同的元素个数方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Python实现程序判断季节的代码示例

    Python实现程序判断季节的代码示例

    今天小编就为大家分享一篇关于Python实现程序判断季节的代码示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Boston数据集预测放假及应用优缺点评估

    Boston数据集预测放假及应用优缺点评估

    这篇文章主要为大家介绍了Boston数据集预测放假及应用优缺点评估,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 使用python获取cpu每秒的使用率

    使用python获取cpu每秒的使用率

    这篇文章主要介绍了使用python获取cpu每秒的使用率,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • python之pkl文件的用法及说明

    python之pkl文件的用法及说明

    这篇文章主要介绍了python之pkl文件的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论