python的函数参数传递

转载 2018年04月17日 15:56:53

对象vs变量

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

类型是属于对象的,而不是变量。

这样,很多问题就容易思考了。

例如:

对象vs变量
nfoo = 1   #一个指向int数据类型的nfoo(再次提醒,nfoo没有类型)
lstFoo = [1]   #一个指向list类型的lstFoo,这个list中包含一个整数1

可更改(mutable)与不可更改(immutable)对象

对应于上一个概念,就必须引出另了另一概念,这就是可更改(mutable)对象不可更改(immutable)对象
对于python比较熟悉的人们都应该了解这个事实,在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。那么,这些所谓的可改变和不可改变影响着什么呢?

可更改vs不可更改
nfoo = 1
nfoo = 2

lstFoo = [1]
lstFoo[0] = 2

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

代码第5行中,更改list中第一个元素的值,因为list是可改变的,所以,第一个元素变更为2。其实应该说,lstFoo指向一个包含一个对象的数组。赋值所发生的事情,是有一个新int对象被指定给lstFoo所指向的数组对象的第一个元素,但是对于lstFoo本身来说,所指向的数组对象并没有变化,只是数组对象的内容发生变化了。这个看似void*的变量所指向的对象仍旧是刚刚的那个有一个int对象的list。

如下图所示:

mutable-immutable-object.jpg

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

对于变量(与对象相对的概念),其实,python函数参数传递可以理解为就是变量传值操作,用C++的方式理解,就是对void*赋值。如果这个变量的值不变,我们看似就是引用,如果这个变量的值改变,我们看着像是在赋值。有点晕是吧,我们仍旧据个例子。

不可变对象参数调用
def ChangeInt( a ):
    a = 10
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
lstFoo = [2]
ChangeList(lstFoo )
print nfoo #结果是[10]

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

恩,现在是不是对python中的变量和对象的概念有了更深入的理解了呢?
通过我上面的解释,我想大家也可以自己搞定其他类型对象的传递问题了吧。

Python 函数作为参数传递

#map()的功能是将函数对象依次作用于表的每一个元素,每次作用的结果储存于返回的表re中。 #map通过读入的函数(这里是lambda函数)来操作数据 def test_func_map(): ...
  • taohuaxinmu123
  • taohuaxinmu123
  • 2015-12-18 17:46:32
  • 4654

怎样把数组作为参数传递给函数

在把数组作为参数传递给函数时,有值传递(by value)和地址传递(by reference)两种方式。在值传递方式中,在说明和定义函数时,要在数组参数的尾部加上一对方括号([]),调用函数时只需将...
  • CAO527121128
  • CAO527121128
  • 2014-10-22 21:30:21
  • 2239

python函数的四种参数传递方式

原文地址:http://freshstu.com/2013/04/four-kinds-of-function-argment-pass-in-python/ python中函数传递参数有四...
  • lushijie5516
  • lushijie5516
  • 2013-10-15 14:32:26
  • 2439

Python语言中函数的参数传递机制

python有两种对象,immutable 和mutable,前者如number,string,tuple,后者如dictionary,list,下面先来看两个例子。 例1: 例2: 首先说明...
  • yp445163091
  • yp445163091
  • 2013-11-14 14:03:44
  • 965

Java的引用和函数参数传递

  • 2018年03月17日 20:01
  • 17KB
  • 下载

关于Python函数参数传递方式--值传递?引用传递!

python3 不允许我们选择参数传递方式,但是他已经全部采用了引用传递。 相关测试代码与解释贴在文章里了。...
  • hffhjh111
  • hffhjh111
  • 2016-07-29 21:35:15
  • 857

一维数组和二位数组作为函数参数进行传递的方式

一维数组的传递 #include //C++将数组名解释为该数组第一个元素的地址,并视函数名为指针 using namespace std; int main() { double chooseMet...
  • Jerry_ICCAS
  • Jerry_ICCAS
  • 2016-04-08 17:37:06
  • 1338

Python函数参数传递:传值还是传引用

引子首先来看一个列子:def change(val): val.append(100) val = ['T', 'Z', 'Y'] nums = [0, 1] change(nums)...
  • T_27080901
  • T_27080901
  • 2016-03-30 11:46:53
  • 11830

Python函数参数,值传递?

传递参数时,会复制引用,若引用指向的对象可以修改,函数内部的修改会在外部体现.若指向的引用不可修改,改变引用会产生新的对象(即引用指向新的对象),此时的引用和外部引用再无关系,修改自然不会体现在外部 ...
  • wangwoliunian
  • wangwoliunian
  • 2014-10-28 15:33:19
  • 448
收藏助手
不良信息举报
您举报文章:python的函数参数传递
举报原因:
原因补充:

(最多只允许输入30个字)