最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • python不可变集合是什么

    正文概述    2020-05-26   253

    python不可变集合是什么

    在很多的其他语言中在传递参数的时候允许程序员选择值传递还是引用传递(比如c语言加上*号传递指针就是引用传递,而直接传递变量名就是值传递),而python只允许使用引用传递,但是它加上了可变类型和不可变类型,让我们感觉有点混乱了。听说python只允许引用传递是为方便内存管理,因为python使用的内存回收机制是计数器回收,就是每块内存上有一个计数器,表示当前有多少个对象指向该内存。每当一个变量不再使用时,就让该计数器-1,有新对象指向该内存时就让计数器+1,当计时器为0时,就可以收回这块内存了。

    python中有可变对象和不可变对象,可变对象:list,dict.不可变对象有:int,string,float,tuple.

    python不可变对象

    int,string,float,tuple

    先来看一个例子

    def int_test(): 
        i = 77
        j = 77
        print(id(77))                  #140396579590760
        print('i id:' + str(id(i)))      #i id:140396579590760
        print('j id:' + str(id(j)))      #j id:140396579590760
        print i is j                    #True
        j = j + 1
        print('new i id:' + str(id(i)))  #new i id:140396579590760
        print('new j id:' + str(id(j)))  #new j id:140396579590736
        print i is j                    #False
    
    if __name__ == '__main__':
        int_test()

    有i和j俩个变量的值为77,通过打印77的ID和变量i,j在内存中的id我们得知它们都是指向同一块内存。所以说i和j都是指向同一个对象的。然后我们修改j的值,让j的值+1.按道理j修改之后应该i的值也发生改变的,因为它们都是指向的同一块内存,但结果是并没有。因为int类型是不可变类型,所有其实是j复制了一份到新的内存地址然后+1,然后j又指向了新的地址。所以j的内存id发生了变化。

    内存分配情况如下:

    python不可变集合是什么

    python可变对象

    dict,list

    def dict_test():
        a = {}
        b = a
        print(id(a))
        a['a'] = 'hhhh'
        print('id a:' + str(id(a)))
        print('a:' + str(a))
        print('id b:' + str(id(b)))
        print('b:' + str(b))if __name__ == '__main__':
        dict_test()

    运行结果如下:

    140367329543360
    
    id a:140367329543360
    
    a:{'a': 'hhhh'}
    
    id b:140367329543360
    
    b:{'a': 'hhhh'}

    可以看到a最早的内存地址id是140367329543360 然后把a赋值给b其实就是让变量b的也指向a所指向的内存空间。然后我们发现当a发生变化后,b也跟着发生变化了,因为list是可变类型,所以并不会复制一份再改变,而是直接在a所指向的内存空间修改数据,而b也是指向该内存空间的,自然b也就跟着改变了。

    内存变化如下:

    python不可变集合是什么

    python函数的参数传递

    由于python规定参数传递都是传递引用,也就是传递给函数的是原变量实际所指向的内存空间,修改的时候就会根据该引用的指向去修改该内存中的内容,所以按道理说我们在函数内改变了传递过来的参数的值的话,原来外部的变量也应该受到影响。但是上面我们说到了python中有可变类型和不可变类型,这样的话,当传过来的是可变类型(list,dict)时,我们在函数内部修改就会影响函数外部的变量。而传入的是不可变类型时在函数内部修改改变量并不会影响函数外部的变量,因为修改的时候会先复制一份再修改。下面通过代码证明一下:

    def test(a_int, b_list):
        a_int = a_int + 1
        b_list.append('13')
        print('inner a_int:' + str(a_int))
        print('inner b_list:' + str(b_list))
    
    if __name__ == '__main__':
        a_int = 5
        b_list = [10, 11]
    
        test(a_int, b_list)
    
        print('outer a_int:' + str(a_int))
        print('outer b_list:' + str(b_list))

    运行结果如下:

    inner a_int:6
    
    inner b_list:[10, 11, '13']
    
    outer a_int:5
    
    outer b_list:[10, 11, '13']

    答案显而易见啦,经过test()方法修改后,传递过来的int类型外部变量没有发生改变,而list这种可变类型则因为test()方法的影响导致内容发生了改变。更多学习内容,请点击python学习网。


    起源地下载网 » python不可变集合是什么

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元