3

重複の可能性:
Python の「最小の驚き」: 変更可能な既定の引数

次のコードがあります。

class Node(object):
    def __init__(self, value = 0, children = {}):
        self.val = value
        self.children = children

    def setChildValue(self, index, childValue):
        self.children[index] = Node(childValue)

n = Node()
n.setChildValue(0,10)
print n.children
n2 = Node()
print n2.children

そしてそれは印刷します:

{0: <__main__.Node object at 0x10586de90>}
{0: <__main__.Node object at 0x10586de90>}

私の質問は、なぜ n2 で子供が定義されているのですか? Children はインスタンス変数ですが、クラス変数のように機能します。

ありがとう

4

3 に答える 3

4

childrenすべてのインスタンスで同じ辞書を割り当てています。

于 2012-10-30T17:27:16.093 に答える
2

関数を定義するとき__init__、辞書をデフォルトの引数として与えます。__init__そのディクショナリは、(関数を定義するときに) 1 回作成され、呼び出されるたびに使用されます。

詳細: http://effbot.org/zone/default-values.htm

于 2012-10-30T17:28:20.623 に答える
1

Martijn のコメントと kindall の回答に示されているように、ある時点でほとんどの Python 開発者を悩ませている変更可能なデフォルト引数の動作に遭遇していNode.__init__()ます。期待どおりに動作するように変更する方法は次のとおりです。

class Node(object):
    def __init__(self, value = 0, children = None):
        self.val = value
        if children is None:
            self.children = {}
        else:
            self.children = children
于 2012-10-30T17:31:12.587 に答える