zoukankan      html  css  js  c++  java
  • 一个问题引出来的:python中可变数据类型与不可变数据类型

    一. 问题的提出

    我们先来看两个对比

    第一道题,当对象为整数时,最终结果:b = 2, a = 1,b的变化没有引起a的变化

    a = 1
    b = a
    b += 1
    
    print(a)
    print(b)
    
    
    结果:
    2
    

    第二道题,当对象为字典时,最终结果:a = {"name":"jack","age":27}, b = {"name":"jack","age":27},b的变化引起了a的变化

    a = {"name": "Jack"}
    b = a
    b["age"] = 27
    
    print(a)
    print(b)
    
    
    结果:
    {"name":"Jack","age":27}
    {"name":"Jack","age":27}
    

    那么,为什么上述两道题的结果会有如此大的区别呢?我们就来了解一下可变数据类型和不变数据类型

    二. 可变数据类型和不可变数据类型

    • 可变数据类型有:列表list、字典dict
    • 不可变数据类型有:整型int、浮点型float、字符串string和元组tuple

    python中有一个id()函数,可用来获取对象的内存地址,我们针对第一题,可以看一下a和b指向的对象的内存地址有什么变化

    >>> a = 1
    >>> b = a
    >>> id(a)
    >>> id(b)
    >>> b += 1
    >>> id(b)
    >>> id(a)
    >>>
    

    我们可以清晰的看到,a = 1, b = a,这两个操作中,变量a和b指向的对象的内存地址是一样的,也就是说a和b其实引用了同一个对象1。那为什么整型是不可变数据类型呢?这里可以理解为a和b的引用地址处的值是不能被改变的,也就是1814284368地址处的值在没被垃圾回收之前一直是1,不能改变,如果把b赋值为2,那么,只能把b的引用地址从1814284368变为1814284400,相当于b += 1这个赋值又创建了一个新的对象2,然后变量a仍然指向对象1,而变量b指向了对象2,变量b的变化并不会引起a的改变,因为它们指向的是不同的对象

    我们大概画个演示图:

    图一:a = 1, b = a

    图二: b += 1
    在这里插入图片描述
    我们再来看字典,先用id()看一下内存地址的变化

    >>> a = {"name": "Jack"}
    >>> b = a
    >>> id(a)
    >>> id(b)
    >>> b["age"] = 27
    >>> id(a)
    >>> id(b)
    >>> a
    {'age': 27, 'name': 'Jack'}
    >>> b
    {'age': 27, 'name': 'Jack'}
    

    可以看到,变量a和b同时指向一个字典对象,当给变量b指向的字典添加元素后,b指向的字典的内存地址并不会发生变化,也就是说,对b的操作不会改变a引用的地址值,相当于同样一个地址得到了扩充,由于a和b指向同一个地址,所以b的变化会引起a的变化

    图一:a = {"name": "Jack"}, b = a

    在这里插入图片描述
    图二:b["age"] = 27
    在这里插入图片描述

  • 相关阅读:
    Vijos训练计划 1304回文数
    18.03.03 位运算作业三则
    18.03.01 codevs1014 装箱问题
    Wikioi 1020 孪生蜘蛛 Label:Floyd最短路
    TYVJ P1004 滑雪 Label:记忆化搜索
    洛谷 P1118 数字三角形游戏 Label:dfs
    TYVJ P1015 公路乘车 &&洛谷 P1192 台阶问题 Label:dp
    洛谷 P1147 连续自然数和 Label:等差数列
    洛谷 P1019 单词接龙 Label:dfs
    洛谷 P1025 数的划分 Label:dp
  • 原文地址:https://www.cnblogs.com/xxpythonxx/p/12608610.html
Copyright © 2011-2022 走看看