• python起步——可变对象和不可变对象


      学习python了一小段时间,觉得整体上还是真的让程序更好写了。  

      学习过程中,突然想到一个问题——我之前博客写过的一篇文章,关于不用第三个数交换a、b的问题:http://www.cnblogs.com/FreeAquar/archive/2012/07/22/2603381.html

      简述一下不用第三个数交换a、b的函数:

     void Swap(int &a , int &b)
     {
         a+=b;
         cout<<a<<" "<<b<<endl;
         b=a-b;
         cout<<a<<" "<<b<<endl;
         a=a-b;
     }

      当然,看起来一切OK,不过当我用这样的方式调用的时候。。。

    Swap(i,i);

      a+=b后,由于a和b的地址是相同的,所以执行a+=b后,a和b还是相同的——a和b都变成2*i了

      然后第二步b=a-b后,a和b都变成了0。最终让这种方式的交换数据失效。

      但是当我用python执行上述思维的代码的时候,却完全没有问题,结果是1,1

    a = 1
    b = a
    
    a = a + b
    b = a - b
    a = a - b
    
    print a, b

      这里就遇到一点思维阻碍了,同一个对象的引用,却可以完全无阻碍的实现上述代码。

      这里就比较迷茫了,上网查找,终于找到问题的原因,就是题目所说的可变对象和不可变对象

      具体可以看这里:http://thomaschen2011.iteye.com/blog/1441254

    • 不可变对象:int,string,float,tuple
    • 可变对象   :list,dictionary

      也就是说a = 1后,这个对象不会变动,当a = a + b时,是会重新申请一个新的对象,修改对象的引用。

      所以,a和b就是不同的了——不论是地址还是值,自然也就不会出现上面C可能遇到的问题了。

      

      拓展试验:

      申请一个a = 1和 b = 1,查看两者的id,发现是相同的,就表示说是一个对象的不同引用。

      python有一点优化,就是a += 1后,a的id值改变,再a -= 1依然是与b相同。

        

    作者:FreeAquar
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    java中的位运算符
    Servlet中的初始化参数、上下文参数、以及@Resource资源注入
    Servlet中文件上传的几种方式
    marquee标签的使用
    SpringBoot热部署的两种方式
    eclipse中安装lombok插件
    关于Servlet中的转发和重定项
    Cormen — The Best Friend Of a Man CodeForces 732B
    牛客小白月赛9之签到题
    Codeforces アンバランス / Unbalanced
  • 原文地址:https://www.cnblogs.com/FreeAquar/p/2952239.html
Copyright © 2020-2023  润新知