From: http://blog.csdn.net/winterttr/article/details/2590741

作者:winterTTr (转载请注明)

我想,这个标题或许是很多初学者的问题。尤其是像我这样的对C/C++比较熟悉,刚刚进入python殿堂的朋友们

。C/C++的函数参数的传递方式根深蒂固的影响这我们的思维--引用?传值?究竟是那种呢。

呵呵,语言的特性决定了是使用的方法,那么,现在我们来探究一下python的函数参数传递方式。

在开始之前,我们有必要分清一下python的一些基础概念。

首先要说的是:变量 与 对象

在python中,类型属于对象,变量是没有类型的,这正是python的语言特性,也是吸引着很多pythoner的一点。所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。所以,希望大家在看到一个python变量的时候,把变量和真正的内存对象分开。

类型是属于对象的,而不是变量。这样,很多问题就容易思考了。

例如:

nfoo = 1   #一个指向int数据类型的nfoo(再次提醒,nfoo没有类型)

lstFoo = [1]   #一个指向list类型的lstFoo,这个list中包含一个整数1。

对应于上一个概念,就必须引出另了另一概念,这就是“可更改”(mutable)与“不可更改”(immutable)对象。

对于python比较熟悉的人们都应该了解这个事实,在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。那么,这些所谓的可改变和不可改变影响着什么呢?

还是上面的例子:

nfoo = 2

这时,内存中原始的1对象因为不能改变,于是被“抛弃”,另nfoo指向一个新的int对象,其值为2

lstFoo[0] = 2

更改list中第一个元素的值,因为list是可改变的,所以,第一个元素变更为2,其实应该说有一个新int对象被指定给lstFoo 所指向的对象的第一个值,但是对于lstFoo 来说,所指向的对象,并没有变化,就是这个看似void*的变量所指向的对象仍旧是刚刚的那个有一个int对象的list。(听着有点晕吧,仔细琢磨一下就明白了,嘿)

好了,被我这么填鸭似的复习了一下python的基础知识,改转回题目的问题了,Python的函数参数传递:传值?引用?

对于变量(与对象相对的概念),其实,python函数参数传递可以理解为就是变量传值操作(注意哦,我说的是变量,不是对象  =_= )

接着说例子好了:

def ChangeInt( a ):

a = 10  # change the number

nfoo = 2

ChangeInt(nfoo)

print nfoo #结果是2

这时发生了什么,有一个int对象2,和指向它的变量nfoo,当传递给ChangeInt的时候,按照传值的方式,复制了变量nfoo的值,这样,a就是nfoo指向同一个Int对象了,函数中a=10的时候,发生什么?

(还记得我上面讲到的那些概念么),int是不能更改的对象,于是,做了一个新的int对象,另a指向它(但是此时,被变量nfoo指向的对象,没有发生变化),于是在外面的感觉就是函数没有改变nfoo的值,看起来像C++中的传值方式。

def ChangeList( a ):

a[0] = 10  # change the number

lstFoo = [2]

ChangeList(lstFoo )

print nfoo #结果是[10]

当传递给ChangeList的时候,变量仍旧按照“传值”的方式,复制了变量lstFoo 的值,于是a和lstFoo 指向同一个对象,但是,list是可以改变的对象,对a[0]的操作,就是对lstFoo指向的对象的内容的操作,于是,这时的a[0] = 10,就是更改了lstFoo 指向的对象的第一个元素,所以,再次输出lstFoo 时,显示[10],内容被改变了,看起来,像C++中的按引用传递。

恩,现在是不是对python中的变量和对象的概念有了更深入的理解了呢?

通过我上面的解释,我想大家也可以自己搞定其他类型对象的传递问题了吧。

Python的函数参数传递:传值?引用?相关推荐

  1. python函数 global_**Python的函数参数传递 和 global

    函数的参数到底是传递的一份复制的值,还是对内存的引用? 我们看下面一段代码: a = [] def fun(x): x.append(1) fun(a) print(a) 想想一下:如果传递的是一份复 ...

  2. python中函数参数传递的三种方式_python中函数参数传递的几种方法

    转自  http://www.douban.com/note/13413855/ Python中函数参数的传递是通过"赋值"来传递的.但这条规则只回答了函数参数传递的"战 ...

  3. 【中级软考】函数参数传递传值与传引用的区别(global关键字,函数内定义全局变量)

    传值调用最显著的特征就是被调用的函数内部对形参的修改不影响实参的值. 引用调用是将实参的地址传递给形参,使得形参的地址就是实参的地址. (对于python而言,普通的实参传个变量(或常量)进去就相当于 ...

  4. [Javascript 高级程序设计]学习心得记录 函数参数传递与引用

    最近开始啃js的红宝书:<Javascript 高级程序设计>,偶有心得,记录一下. 先上代码 function howManyArgs() {alert(arguments.length ...

  5. Python 函数参数传递

    前言 Python 的函数参数传递相对于 C++来说更加灵活,并且使用也很方便,这里做下简单的总结. 正文 实参和形参 实参:在调用函数时提供的函数参数称为实参. 形参:定义函数时,函数中的变量成为形 ...

  6. html绑定带有形参的函数,Python中函数参数类型和参数绑定

    参数类型 Python函数的参数类型一共有五种,分别是: POSITIONAL_OR_KEYWORD(位置参数或关键字参数) VAR_POSITIONAL(可变参数) KEYWORD_ONLY(关键字 ...

  7. Python中的赋值、引用和深浅拷贝

    2019独角兽企业重金招聘Python工程师标准>>> 全局变量 在函数之外创建的变量属于main,又被称为全局变量.它们可以在main中的任意函数中访问,与局部变量在函数结束时消失 ...

  8. python的函数的定义与调用

    函数的定义与调用 1.定义函数 定义函数的格式如下: def 函数名(): 代码 注:python文件名一定不要取为test.py     标出的两个文件,虽为空文件,但一定不要去删除         ...

  9. python中函数的参数

    函数参数(一) 思考一个问题,如下: 现在需要定义一个函数,这个函数能够完成2个数的加法运算,并且把结果打印出来,该怎样设计?下面的代码可以吗?有什么缺陷吗? def add2num():a = 11 ...

最新文章

  1. Android SurfaceView 黑背景的处理方法
  2. geoserver安装_pgRouting教程九:使用GeoServer发布WMS/WFS接口
  3. 常用解决方案技术一览
  4. ActiveMQ作为Logstash的消息代理
  5. 使用IntelliJ书签
  6. tableau 倒序都倒了_Tableau优秀作品拆解复刻01-是时候终结瘘管病了
  7. 数据字典简单例子_Python学习100天-Day14(数据分析篇-pandas02)
  8. 9-3 数据分布概论
  9. C#使用StreamWriter类写入文件文件
  10. git 合并其他分支代码到自己的分支
  11. Ubuntu /CentOS 设置开机启动,添加自定义系统服务,自定义开机启动
  12. 使用代码控制小米智能插座
  13. 海思Hi3519A开发(5.梳理海思文档与运行sample代码)
  14. 云计算第二天总结 10.29
  15. windows安装Oracle12 (服务端+客户端)
  16. 中职计算机英语教师教学总结,中职教师工作总结
  17. Utorrent死机恢复种子下载
  18. 【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器
  19. Xilinx官方DDR3调试总结
  20. The server time zone value '?й???????' is unrecognized or represents more than one time zone. You mu

热门文章

  1. 回归分析预测_使用回归分析预测心脏病。
  2. leetcode96. 不同的二叉搜索树(动态规划)
  3. gcc汇编汇编语言_什么是汇编语言?
  4. javascript异步_JavaScript异步并在循环中等待
  5. spray.json_如何使用Spray-json(Un)在Akka HTTP中封送JSON
  6. 查看这些有用的ECMAScript 2015(ES6)提示和技巧
  7. 成千上万的在线课程时,如何保持理智和学习编码
  8. python边玩边学_边听边学数据科学
  9. No-3.Linux 终端命令格式
  10. Java学习----运算符与表达式