0

我对 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 实例。为什么所有实例都更改了?

4

1 回答 1

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

于 2013-08-12T14:31:15.963 回答