2017-09-18 10:28:30

python传参与返回值

今天去面试python岗位,笔试第一个题目就是这个知识点,以前也遇到过,由于受原先工作(游戏服务端)影响,关注的点是怎么做项目、网络、并发方面,而忽略了最基本的python语言的基本特性。虽然之前也见过这个类型的东东,但是没怎么管它,看来有必要花点时间把python本身的语言特性、内置函数和一些常用内置模块的官方文档过一遍,前段时间把django的官方文档倒是花了几天时间过了很多,想想有点郁闷~

题目很简单,就几行(也许有点出入,应该比这个还复杂点):

def extendList(val, l=[]):
    l.append(val)
    return l

print(extendList(1))
print(extendList(1, []))
print(extendList("a"))

输出:

[1]
[1]
[1, 'a']

这里有几个点要注意:

  • 不管是函数参数还是函数返回值,如果参数/返回值是可变的,那么会传递引用,如果是不可变(number、tuple、string)的,那么会传递值,说白了如果是传引用,那么会在函数内部复制一个引用,如果传值,那么会在函数内部复制值
  • 默认参数l的内存在函数声明时就创建了
  • 当函数不提供默认参数时,那么就会采用默认已经创建好的那块内存的引用。如果提供了,那么默认参数的那块内存就被提供的参数给代替了。

理解上面几点这个问题就搞清楚了。

再来个小几行:

def change(val):
    val.append(100)
    val = ['x', 'y', 'z']
l = [0, 1]
change(l)
print(l)

猜猜结果?~

Permanent link of this article:http://nulls.cc/post/python_pass_param_returnvalue

-- EOF --