Python中参数的传递本质——建立变量与对象的关联
2015-10-27 16:37
393 查看
参考文章1:知乎网站
参考文章2:winterTTr 的个人博客
参考文章3
在python中,类型属于对象,变量是没有类型的,这正是python的语言特性,也是吸引着很多pythoner的一点。所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。所以,希望大家在看到一个python变量的时候,把变量和真正的内存对象分开。
我们先看一段代码:
我们会发现:打印出来的d的值是2.为什么呢?这就涉及到Python参数传递的本质。
首先我们必须明白,Python的函数传递方式是赋值,而赋值是通过建立变量与对象的关联实现的。
对于这一段代码:执行 d = 2时,我们在main里创建了d,并让它指向2这个整型对象。
执行函数add(d)过程中:d被传递给add()函数后,在函数内部,num也指向了main中的2但执行num = num + 10之后,新建了对象12,并让num指向了这个新对象——12。
如果我们明白函数中的局部变量与main中变量的区别,那么很显然,在main中,d仍在指着2这个对象,它没有改变。
因此,我们打印d时得到了2。
如果你想让输出为12,最简洁的办法是:
1. 在函数add()里增加return num
2. 调用函数时使用d = add(d)——这个其实也是利用了return函数
或者我们可以这么想:
我们实际上做的是试图改变一个不可改变的int值,所以函数新建了另外一个int,指向了12.在函数内部我们认为改变有效。但是离开了函数这个范围(以后会讨论这个问题),d这个指向2的变量就会“原形毕露”,事实上d的指向从来没有被更改过。d本身没有值,只是指向了2这个对象。
注:在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。
值得我们注意的是:
指向一个列表的时候,又会有不一样的情况发生。
因为列表本身可以修改,所以,当我们做出这样的操作时:
这个时候,输出结果是12.为什么呢?事实上,d这时指向了一个列表。列表本身没有改变,只是列表的值发生了变化(原来的值会被回收)。所以我们改变一个可变的对象的时候不会感到如此迷糊。
初学者的粗浅之见,难免会有一些错误的地方。感谢本文引用的话的各位原作者。
预计下一篇关于python的文章,是关于函数的作用域,拷贝,以及更加抽象的东西的。谢谢各位的关注。
有点想在广州、上海的基友了= = ——作者的絮叨
参考文章2:winterTTr 的个人博客
参考文章3
在python中,类型属于对象,变量是没有类型的,这正是python的语言特性,也是吸引着很多pythoner的一点。所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。所以,希望大家在看到一个python变量的时候,把变量和真正的内存对象分开。
我们先看一段代码:
def add(num): num= num+10 d=2 add(d) print d
我们会发现:打印出来的d的值是2.为什么呢?这就涉及到Python参数传递的本质。
首先我们必须明白,Python的函数传递方式是赋值,而赋值是通过建立变量与对象的关联实现的。
对于这一段代码:执行 d = 2时,我们在main里创建了d,并让它指向2这个整型对象。
执行函数add(d)过程中:d被传递给add()函数后,在函数内部,num也指向了main中的2但执行num = num + 10之后,新建了对象12,并让num指向了这个新对象——12。
如果我们明白函数中的局部变量与main中变量的区别,那么很显然,在main中,d仍在指着2这个对象,它没有改变。
因此,我们打印d时得到了2。
如果你想让输出为12,最简洁的办法是:
1. 在函数add()里增加return num
2. 调用函数时使用d = add(d)——这个其实也是利用了return函数
或者我们可以这么想:
def add(d): num= d num= num+10
我们实际上做的是试图改变一个不可改变的int值,所以函数新建了另外一个int,指向了12.在函数内部我们认为改变有效。但是离开了函数这个范围(以后会讨论这个问题),d这个指向2的变量就会“原形毕露”,事实上d的指向从来没有被更改过。d本身没有值,只是指向了2这个对象。
注:在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。
值得我们注意的是:
指向一个列表的时候,又会有不一样的情况发生。
因为列表本身可以修改,所以,当我们做出这样的操作时:
def add(num) num[0]= num[0] +10 d= [2] add(d) print d[0]
这个时候,输出结果是12.为什么呢?事实上,d这时指向了一个列表。列表本身没有改变,只是列表的值发生了变化(原来的值会被回收)。所以我们改变一个可变的对象的时候不会感到如此迷糊。
初学者的粗浅之见,难免会有一些错误的地方。感谢本文引用的话的各位原作者。
预计下一篇关于python的文章,是关于函数的作用域,拷贝,以及更加抽象的东西的。谢谢各位的关注。
有点想在广州、上海的基友了= = ——作者的絮叨
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法