Python中的默认参数

时间:2013-08-12 14:30:23

标签: python arguments default-arguments

我对Python中的默认参数感到困惑。这是我的代码:

#!/usr/bin/env python
import sys 
class Node(object):
     def __init__(self, ID=str(), items=[]):
         self.ID = ID
         self.items = items

 if __name__ == '__main__':
     a = Node('1')
     b = Node('2')
     b.items.append('sth.')
     c = Node('3')
     print a.items
     print b.items
     print c.items

The output is:
['sth.']
['sth.']
['sth.']

我只是更改了b实例。为什么所有实例都被更改?

1 个答案:

答案 0 :(得分:4)

这是一个参考案例。由于列表items是可变的(可以使用内部方法直接更改),因此您在任何函数中对其所做的任何更改都会反映在对它的所有引用中。

例如,如果您有以下代码:

def f(x):
    x.append(5)

a = [1, 2, 3]
f(a)
# a is now [1, 2, 3, 4], even in the global scope

这是因为a是一个可变列表,因此它通过引用传递。

因此,当您使用items = []时,您在程序启动时创建一个空白列表,但每次创建新实例时都不。相反,每个实例引用相同的列表,在“声明”类时创建。因此,由于每个实例引用相同的列表,因此它们都会更改。

要解决此问题,请将构造函数更改为:

def __init__(self, ID=str(), items=None): # you can also use '' instead of str()
    if not items: items = []
    # everything else

一些很好的链接可以更好地解释这个/以不同的方式:

还有很多其他问题,只需搜索[python] None as default argument