python函数作为参数传递,python函数中的参数传递的两种方式

  python函数作为参数传递,python函数中的参数传递的两种方式

  在学习了Python函数这一章之后,很自然地会想到Python中传递参数和值的函数。还是引用?还是都不是?

  在回答上面的问题之前,我们先来看看下面的代码:

  代码1:

  def foo(var):

  var=2

  打印(var)#输出:2

  a=1

  foo(a)

  打印(a)#输出:1

  看起来像是值传递。

  代码2:

  定义栏(变量):

  变量追加(1)

  b=[]

  打印(b)#输出:[]

  酒吧(b)

  打印(b)#输出:[1]

  应该通过引用吗?有点奇怪。为了弄清楚这一点,我们先来了解一下Python中变量和对象之间的关系。

  一.变量和对象

  首先要知道Python中的“变量”和C/C中的“变量”是不一样的。

  在C/C中,当你初始化一个变量时,你声明了一个存储空间并写入了值。相当于在一个盒子里放一个值:

  int a=1;

  现在,在框A中有一个整数1,当另一个值赋给变量A时,它将替换框A中的内容:

  a=2;

  当你将变量A赋给另一个变量时,你将复制框A中的值,并把它放到一个新的“框”中:

  int b=a;

  但在Python中,变量可以说是内存中对象的“标签”或“引用”:

  a=1

  现在变量A指向内存中的一个int对象(A相当于对象的标签)。如果A被重新分配,那么“标签”A将移动并指向另一个对象:

  a=2

  值为1的原始int对象仍然存在,但是我们无法通过标识符A访问它(当一个对象没有任何指向它的标签或引用时,它将被自动释放)。如果我们把变量A赋给另一个变量,我们只是给当前内存中的对象加了一个“标签”:

  b=a

  综上所述,在Python中,变量只是一个标签,一个标识符,它指向内存中的一个对象。所以变量没有类型,类型属于对象,这也是Python中变量可以被任何类型赋值的原因。

  第二,可变对象和不可变对象

  在Python的基本数据类型中,我们知道数字、字符串和元组是不可变的对象,而list和dict是可修改的对象。那么可变和不可变有什么区别呢?请看下面的例子:

  A=1 # a指向内存中的一个int对象。

  A=2 #改派

  当a被重新分配时,由于原始值为1的对象不能改变,a将指向一个新的值为2的int对象。(如下图所示)

  示例2

  List1=[1,2] # List1指向内存中list类型的对象。

  1 [0]=2 #重新分配list1中的第一个元素

  因为列表类型可以更改,所以第一个元素更改为2。更具体地说,list1的第一个元素是一个int类型,在重新赋值时,一个新的int对象被赋给第一个元素。但是,对于list1来说,它引用的list对象并没有发生变化,只有list的内容(元素之一)发生了变化。如下图:

  现在让我们来看看前两段代码:

  def foo(var):

  var=2

  打印(var)

  a=1

  foo(a)

  打印(一份)

  上面的代码将a作为参数传递给函数,然后a和var都指向内存中值为1的对象。然后,当函数中var=2时,因为int对象不能改变,所以创建一个新的int对象(值为2),var指向它。a仍然指向原来的int对象,值为1,所以函数不改变变量a。

  如下图:

  代码2;

  定义栏(变量):

  变量追加(1)

  b=[]

  打印(b)

  酒吧(b)

  打印(b)

  这段代码将b传递给函数栏,这样b和var都指向同一个列表类型对象。因为list对象是可以改变的,所以在函数中使用append在它的末尾增加了一个元素,list对象的内容发生了变化,但是B和var仍然指向这个list对象,所以变量B的内容也发生了变化。

  如下图:

  那么在Python中,参数传递的是值还是引用呢?准确答案:都不是。不传递值的原因是没有副本,函数和调用者有相同的对象。它看起来更像是对C的引用,但有时它不能改变参数的值。所以只能这么说:对于不可变对象,看起来像C中的传值方式;对于可变对象,它看起来像c #中的引用传递。

  涉及

  转载请联系作者取得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: