zoukankan      html  css  js  c++  java
  • python中的可变参数和不可变参数

    知识点:Python中,万物皆对象。

       python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址。

    一、可变对象和不可变对象

    Python在heap中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变。

    不可变(immutable):int、字符串(string)、float、(数值型number)、元组(tuple)

    可变(mutable):字典型(dictionary)、列表型(list)

    不可变类型特点:

      看下面的例子(例1)

    [python] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. i = 73  
    2. i += 2  


    从上图可知,不可变对象的特征没有变,变的只是创建了新对象,改变了变量的对象引用。

      看一个例子(例2)

    >>>x = 1
    >>>y = 1
    >>>x = 1
    >>> x is y
    True
    >>>y is z
    True

      如上所示,因为整数为不可变,x,y,z在内存中均指向一个值为1的内存地址,也就是说,x,y,z均指向的是同一个地址,值得注意的是,整形来说,目前仅支持(-1,100)。

      总结一下,不可变对象的优缺点。

        优点是,这样可以减少重复的值对内存空间的占用

        缺点呢,如例1所示,我要修改这个变量绑定的值,如果内存中没用存在该值的内存块,那么必须重新开辟一块内存,把新地址与变量名绑定。而不是修改变量原来指向的内存块的值,这回给执行效率带来一定的降低。

      下面看一个可变对象的例子(例3)

    m=[5,9]
    m+=[6]
    

    二、函数参数:

    Python函数参数对于可变对象,函数内对参数的改变会影响到原始对象;对于不可变对象,函数内对参数的改变不会影响到原始参数。原因在于:

    1、可变对象,参数改变的是可变对象,其内容可以被修改。

    2、不可变对象,改变的是函数内变量的指向对象。

    比如存在2个列表 a 和 b

    如果a=b的话, a和b的地址是相同的;如果只是想拷贝,那么就得用 a=b[:]

    参考链接:

    http://www.cnblogs.com/evening/archive/2012/04/11/2442788.html

    http://thomaschen2011.iteye.com/blog/1441254




  • 相关阅读:
    看完动画你还会不懂 快速排序么
    看动画轻松理解时间复杂度(一)
    LeetCode Animation 题目图解汇总(持续更新中...)
    分而治之,归并排序的动画演示
    在Object-C中学习数据结构与算法之排序算法
    iOS面试准备之思维导图
    .net core跨域设置
    .NET Core WebAPI Swagger使用
    vue-resource emulateJSON的作用
    百度地图API简单初始化
  • 原文地址:https://www.cnblogs.com/solakevon/p/6044757.html
Copyright © 2011-2022 走看看