python起步——可变对象和不可变对象
2020-02-17 04:20
176 查看
学习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相同。
转载于:https://www.cnblogs.com/FreeAquar/archive/2013/03/10/2952239.html
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- Gvim —— win 7 下 vim 环境配置 及python开发常用设置
- 使用python脚本提取OC中写死的字符串方便国际化
- python3利用pandas将csv文件中的数据导入mysql数据库
- 【Python基础操作】1.数据读取(csv,Excel,MySQL)
- Python3.6.2 图形界面模块Tk (Day1)
- 用python+tkinter写个校验和工具
- python selenium+pywin32 实现网页另存为
- python 输出所有大小写字母和0~9数字
- pycharm导入python包
- python神器pycharm的安装
- python字符串前加 f 的含义
- Python中 IOError 和 FileNotFoundError
- Python-List
- Python-List-Append
- Python-List-extend
- Python-List-Pop
- Python-List-sort
- 关于pycharm用不了numpy
- 零基础学Python
- PAT 1010 一元多项式求导 Python实现