先看一段代码
<code>i</code><code>=</code><code>5</code>
<code>def</code> <code>test(arg</code><code>=</code><code>i):</code>
<code> </code><code>print</code> <code>(arg)</code>
<code>i</code><code>=</code><code>6</code>
<code>test()</code>
测试一下,结果为5,这跟一般的编程语言结果不一样。按照python的说法,是函数默认值只能被赋值一次,也就是说一开始arg被赋值为5后,就不会再被赋值了,尽管在运行函数前i被赋值为6,不知道这样理解对不对,这个要注意,很容易出错。
下一段代码
<code>def</code> <code>test(i,l</code><code>=</code><code>[]):</code>
<code> </code><code>l.append(i)</code>
<code> </code><code>print</code> <code>(l)</code>
<code>test(</code><code>1</code><code>)</code>
<code>test(</code><code>2</code><code>)</code>
<code>test(</code><code>3</code><code>)</code>
测试后结果为
<code>[1]</code>
<code>[1, 2]</code>
<code>[1, 2, 3]</code>
这个结果也和大部分的编程语言不一样,因为l这个变量被初始为空列表,如果在函数调用中没有再给定义,那么后续调用过程中会累积(前面)传给它的参数。
这是比较深入的解答:
对于传统语言,上面这段代码的执行方式将会是,先在内存中申明一个p的变量,然后将1存入变量p所在内存。执行加法操作的时候得到2的结果,将2这个数值再次存入到p所在内存地址中。可见整个执行过程中,变化的是变量p所在内存地址上的值
而这段代码中,Python实际上是现在执行内存中创建了一个1的对象,并将p指向了它。在执行加法操作的时候,实际上通过加法操作得到了一个2的新对象,并将p指向这个新的对象。可见整个执行过程中,变化的是p指向的内存地址
如果想要避免这种情况,要么不要用能够变化的对象作为默认参数,要么
<code>def test(i, l=None):</code>
<code> </code><code>if l is None:</code>
<code> </code><code>l = []</code>
<code> </code><code>return l</code>
本文转自 DEAST 51CTO博客,原文链接:http://blog.51cto.com/xudongdong/1981980