关于Python函数的一些问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Python函数的一些问题相关的知识,希望对你有一定的参考价值。

先看一段代码

i=5
def test(arg=i):
    print (arg)
i=6
test()

测试一下,结果为5,这跟一般的编程语言结果不一样。按照python的说法,是函数默认值只能被赋值一次,也就是说一开始arg被赋值为5后,就不会再被赋值了,尽管在运行函数前i被赋值为6,不知道这样理解对不对,这个要注意,很容易出错。


下一段代码

def test(i,l=[]):
    l.append(i)
    print (l)
test(1)
test(2)
test(3)

测试后结果为

[1]
[1, 2]
[1, 2, 3]

这个结果也和大部分的编程语言不一样,因为l这个变量被初始为空列表,如果在函数调用中没有再给定义,那么后续调用过程中会累积(前面)传给它的参数。

这是比较深入的解答:

对于传统语言,上面这段代码的执行方式将会是,先在内存中申明一个p的变量,然后将1存入变量p所在内存。执行加法操作的时候得到2的结果,将2这个数值再次存入到p所在内存地址中。可见整个执行过程中,变化的是变量p所在内存地址上的值

而这段代码中,Python实际上是现在执行内存中创建了一个1的对象,并将p指向了它。在执行加法操作的时候,实际上通过加法操作得到了一个2的新对象,并将p指向这个新的对象。可见整个执行过程中,变化的是p指向的内存地址

如果想要避免这种情况,要么不要用能够变化的对象作为默认参数,要么

def test(i, l=None):
    if l is None:
        l = []
    l.append(i)
    return l


本文出自 “Deast的窝” 博客,请务必保留此出处http://xudongdong.blog.51cto.com/1889083/1981980

以上是关于关于Python函数的一些问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

关于代码片段的时间复杂度

python关于八皇后判断冲突函数的一些逻辑小问题

python [代码片段]一些有趣的代码#sort

关于片段生命周期

几个关于js数组方法reduce的经典片段