Python的函数参数传递:传值?引用?

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中的变量和对象的概念有了更深入的理解了呢?

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux常见紧急情况处理

1.使用急救盘组进行维护急救盘组(也称为boot/root盘组),是系统管理员必不可少的工具。用它可以独立地启动和运行一个完整的Linux系统。实际上,急救盘组中的第2张盘上就有一个完整的Linux系统,包括root文件系…

Python 去除列表中重复的元素

From: http://www.cnblogs.com/infim/archive/2011/03/10/1979615.html 比较容易记忆的是用内置的set l1 [b,c,d,b,c,a,a]l2 list(set(l1))print l2还有一种据说速度更快的,没测试过两者的速度差别l1 [b,c,d,b,c,a,a]l2 {}.fromkeys(l1).keys()print l2这两种都…

[MODX] 2. Chunks $

Chunk in Modx can cut your template into samll pieces to make code reuseable. [[$chunk_name]] For example we can replace the html header with [[$html_header]], it should work as before. 转载于:https://www.cnblogs.com/Answer1215/p/4174762.html

React开发(149):二位数组的使用

二维数组的定义 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><script type"text/javascript">// 定义一维数组var arr1 [1,2,3,4]var arr2 [5,6,7,8]var ar…

田志刚:个人掌握知识的精髓

【编者按】很多人都在抱怨找不到自己的竞争力&#xff0c;不知道该如何与别人竞争&#xff1b;也有很多人眼睁睁的看着同部门其他同事业绩比自己高一大截&#xff0c;却非常迷茫的找不到差距……这些问题都是切实存在的&#xff0c;而且基本上在每个人身上都曾出现过&#xff0…

【转载】async await 的前世今生(Updated)

async 和 await 出现在C# 5.0之后&#xff0c;给并行编程带来了不少的方便&#xff0c;特别是当在MVC中的Action也变成async之后&#xff0c;有点开始什么都是async的味道了。但是这也给我们编程埋下了一些隐患&#xff0c;有时候可能会产生一些我们自己都不知道怎么产生的Bug&…

H5页面移动端双击屏幕禁止页面放大

在meta标签中加入user-scalableno属性 <meta name"viewport" content"widthdevice-width,initial-scale1,maximum-scale1,minimum-scale1,user-scalableno" />

在C语言中巧用正则表达式

From: http://blog.chinaunix.net/space.php?uid20435679&doblog&id1680220 标准的C和C都不支持正则表达式&#xff0c;但有一些函数库可以辅助C/C程序员完成这一功能&#xff0c;其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库&#xff0c;许多…

[笑]每个人都有脑袋脱线的时候……

每个人的脑子在一霎间短路时会做出好笑的事情来&#xff0c;我也是&#xff0c;不过现在让我想还真想不起来&#xff0c;只是在看到下面这篇文章时心里会有似曾相识的感觉&#xff0c;转来让大家感受一下&#xff1a;洗衣服时想吐痰&#xff0c;旁边是马桶&#xff0c;结果一口…

Taro+react开发(60) 第三方icon使用

<AtIconprefixClass"icon"value{isLike true ? "icon-like-select" : "icon-like-default"}size"14"color{isLike true ? "#FF7F00" : "#999"}onClick{() > this.handleIsLike()}></AtIcon>

middlegenidenbsp;nbsp;eclipsenbsp;的插件

eclipse 的插件很好安装的.拖进eclipse的文件夹.加到plugins和features里. 加到eclipse jee里..没反应. 只好加到eclipse j2se里. 可以的. 重要的是这个 学校发的书说只有oracle需要设category和schema. 坑人. 说只就要严谨些 之后的就不用说了 转载于:https://www.cnblog…

mint-ui修改样式的小技巧

1.前言&#xff1a;不是正经的前端&#xff0c;所以很多东西无法注意和知道&#xff0c;就知道一点记录一点好了。 2.之前想修改mint-ui的样式&#xff0c;但是官方文档丝毫未提及&#xff08;也许前端人员都知道如何修改???&#xff09;,后面通过两种方式可以进行mint-ui的…

C语言正则表达式regex

From: http://hi.baidu.com/david_jlu/blog/item/87ada1dbb9af6a60d0164eda.html 正则表达式在linux下应用非常广泛&#xff0c;经常使用sed、awk、grep、vi、emacs等都支持正则表达式&#xff0c;处理最好的莫过于perl&#xff0c;perl把正则表达式内置到语言内&#xff0c;使…

PL/SQL块中不能直接执行DDL语句(错误)

在PL/SQL块中不能直接执行DDL语句(后篇批量删除表时却明明在PL/SQL块中使用了DROP&#xff0c;而且执行成功&#xff0c;厄...自打三十大板...谁来救我...)declarev_string varchar2(1000);beginv_string:create table dm_test as select * from dm_mpg_test where nyr20…

立足优势,你的网站会更精彩

前几天跟一个做培训的朋友喝茶&#xff0c;聊天期间我问他们公司主要做哪些方面的培训&#xff0c;他笑着说他们公司的业务范围可广了&#xff0c;IT培训&#xff0c;MBA考辅&#xff0c;婴幼儿教育&#xff0c;英语培训......言语中流露出无比的自豪&#xff0c;我最后问了一句…

POSIX风格正则表达式

From: http://blog.chinaunix.net/space.php?uid20501242&doblog&id1940007 4.9 POSIX风格正则表达式 POSIX-Style Regular Expressions POSIX 你已经了解了正则表达式的基础知识&#xff0c;接下来我们可以讨论一下其细节。POSIX风格的正则表达式使用Unix地区系统…

Spring对事务管理的支持的发展历程(基础篇)

1、问题Java代码 Connection conn DataSourceUtils.getConnection(); //开启事务 conn.setAutoCommit(false); try { Object retVal callback.doInConnection(conn); conn.commit(); //提交事务 return retVal; }catch (Excep…