0

タイトルの質問が明確でない場合は申し訳ありませんが、スペースが限られているため、明確にするために...

私のコードには、オブジェクトを格納するための空のリストを作成する empDB というクラスがあります。

リストに新しいオブジェクトを追加するには、empDB に appendEmp というメソッドを作成しました。appendEmp は、インスタンス化するクラスを指定する 1 つのパラメーターを取り、それをリストに追加します。パラメータが指定されていない場合、デフォルトでクラス Employee() になります。

ここに私の問題があります

メソッドappendEmpを呼び出すと、リストに新しいオブジェクトが作成されますが、リストに既にあるオブジェクトをインスタンス化しようとすると、そのエイリアスのみが作成されます。リスト内の各オブジェクトの属性を個別に編集できるように、毎回新しいオブジェクトを作成する必要があります。

ここに私のコードのスニペットがあります:

class empDB:

    def __init__(self, lst= []):                  #creates empty list
        self.lst = lst

    def appendEmp(self, emp=Employee()):
        self.lst=self.lst+[emp]

基本的にこれが今起こっていることです

>>> db=empDB()
>>> db.appendEmp()
>>> db.appendEmp()
>>> db[0] is db[1]
True

私はそれが偽である必要があります

4

2 に答える 2

1

次のように問題を解決できます。

class empDB:
    def __init__(self, lst= []):  #creates empty list
        self.lst = lst
    def appendEmp(self, emp=None):
        if emp is None:
            empt = Employee()
        self.lst=self.lst+[emp]

この問題は、変更可能な値がデフォルトの引数として割り当てられていることが原因でした。に置き換えましたがNone、この値を の引数として受け入れたい場合はappendEmp()、別のものに置き換えることができます。

ここで読むことができる変更可能なデフォルト引数を使用する危険性の詳細: Python の隠された機能: 変更可能なデフォルト引数の危険性

Ps。__init__()メソッドに対しても同じことをしたいかもしれません。

于 2012-05-09T00:30:03.757 に答える
0

変更可能なデフォルト引数は、それらがどのように機能するかを完全に認識していない場合、問題を引き起こす可能性があります. ほとんどの初心者は、定義が処理されるときに、キーワード引数のデフォルト値が 1 回だけ計算されることに気づいていません。その後、関数コードがこのオブジェクトを変更すると、デフォルト オブジェクトを使用する次の呼び出しで、変更された値が表示されます。

http://holdenweb.com/files/IntroNotes.pdf#page=118から始まる写真でこれを説明します

ところで、これらのメモは、私の「Python 入門」クラスのオープン ソース リリースの草稿であるため、フィードバックをいただければ幸いです。

于 2012-05-09T05:48:10.253 に答える