zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    LeetCode 326. Power of Three
    LeetCode 324. Wiggle Sort II
    LeetCode 322. Coin Change
    LeetCode 321. Create Maximum Number
    LeetCode 319. Bulb Switcher
    LeetCode 318. Maximum Product of Word Lengths
    LeetCode 310. Minimum Height Trees (DFS)
    个人站点大开发!--起始篇
    LeetCode 313. Super Ugly Number
    LeetCode 309. Best Time to Buy and Sell Stock with Cooldown (DP)
  • 原文地址:https://www.cnblogs.com/FreeAquar/p/2952239.html
Copyright © 2011-2022 走看看