python的函数参数困惑,值传和引用

毕业之后有些日子没有写程序了,前日偶尔用python写了个小程序,陡然间发现对python的理解和记忆变差了,其中有一点就是对于python的函数参数的理解。

python函数参数,def foo(arg): .... ,这里的arg应该是怎样一种传递方式呢,值传抑或引用?

对于数值,字符串,元组这些不能变动的数据类型这里就不说了,值传。(引用方式的话也没有意义啊)

那对于list, dict, 类的对象这样的数据类型呢?(这里没有考虑set等数据类型,如果有需求也可以自己试试看)

首先对于list进行简单的测试。假设我们的list是很简单的,包含的元素都是整型数。我们定义:
  >>>def foo(arg):
  ... for i in range(len(arg)):
  ... arg[i] += 1
那么,我们的list在由foo调用后,list的元素都会被加一,由此不知道是不是能说明对于list这样可变的数据结构,函数参数的调用方式是引用。需要说明的是,for i in range(len(arg)) : arg[i] += 1,不能写成for i in arg : i += 1,原因的话可以这样考虑:虽然同为循环遍历,但前者是在list层面进行修改的,list是可变的,但后者的i应该为类似it=iter(arg); i=it.next()的操作,其操作层面在list内部的元素,我们这里的list的元素为整型数,是不可变的。

然后是对于dict进行简单的测试。我们进行简单的操作:
  >>>dic = {0:0, 1:11, 2:22}
  >>>def bar(arg):
  ... arg[1] += 1
  >>>bar(dic)
可以观察到dic的元素发生了变化,不知道是不是也可以简单的说明问题。当然也可以粗暴的有:for i in arg.iterkeys(): arg[i] += 1。

接下来是对于类的对象的简单测试。在只考虑基本的数据结构的情况下,我们这样定义我们的自定义类:
  >>>class TestObj(object):
  ... def __init__(self):
  ... self._int = 0
  ... self._str = ‘123’
  ... sefl._list = [3,2,1]
  ... self._dict = {0:0, 1:11, 2:22}
所进行测试的函数基本与前面的foo和bar相似,故这里不再赘述,结果也基本同前相似,表现为引用传递。

以上简单测试的结果与python2或python3的环境无关。并且,我们跳过了当list,dict,类对象作为函数参数,函数内部尝试对虚参尝试重新绑定的测试,毫无疑问,其结果与整型数,字符串等不可变的数据类型作为参数时的结果是一致的。因此,或许可以得出一下结论:python的函数参数,仅当参数是可变的,并且函数内部是对参数的属性进行变更时,此时参数的传递方式可以考虑为引用传递。

并且,我们知道python中的东西都可以看作是对象,即使是函数和方法,因此对于类的对象作为函数参数的情况,当函数内部将对象的方法进行重新绑定这样的变更时,也是可以考虑引用传递的。

你可能感兴趣的:(python学习)