自分自身を(再帰的に)呼び出すメンバーメソッドが無限ループに入らないのはなぜですか?

トライマックス

この例はブログから取ったものですが、わかりません。

>>> class Udict:
    def __init__(self, dict=None):
        self.data = {}
        if dict is not None: self.update(dict)
    def update(self, dict=None):
        self.data.update(dict)
        print(self.data)

>>> d = {1:'one', 2:'two'}
>>> g = Udict(d)
{1: 'two', 2: 'two'}
>>> g.data
{1: 'two', 2: 'two'}
>>> c.Udict()
{}
>>> c.update({3: 'three'})
{3: 'three'}
>>> 

'RuntimeError:最大再帰深度を超える'までobj.update()関数が再帰的に呼び出されることを期待しています

しかし、いいえ、update()関数はに到達します print(self.data)

self.data.update(dict) それ自体にメソッドupdate()を呼び出しているのに、なぜそれが期待どおりに機能しないのですか?

関数の呼び出し自体が無限ループに入らない理由を誰かが私に説明できますか?例のあるブログはそれを説明していません。

ジェームズ

self.data!= self.update

ここで、self.dataは、ディクショナリオブジェクトあるインスタンス変数ですディクショナリオブジェクトにはupdateメソッドがあります。したがって、self.data.update()を呼び出すと、ディクショナリ内のメソッドが呼び出されます。

>>> help(dict.update)
Help on method_descriptor:

update(...)
   D.update(E, **F) -> None.  Update D from dict/iterable E and F.
   If E has a .keys() method, does:     for k in E: D[k] = E[k]
   If E lacks .keys() method, does:     for (k, v) in E: D[k] = v
   In either case, this is followed by: for k in F: D[k] = F[k]
>>>

そして、self.updateはクラスUdictのインスタンスメソッドです。

それでは、コードを少し書き直してみましょう。

>>> class Udict:
...     def __init__(self):
...         self.data = dict()
...     def update(self, dic=None):
...         if dic:
...             self.data.update(dic)
...         return self.data
...
>>> d = {1:'one', 2:'two'}
>>> g = Udict()
>>> g.update(d)
{1: 'one', 2: 'two'}

より良い方法として、init()からメソッドを呼び出さないでください。属性の初期化にのみinit()を使用してください。そのため、次のような引数からdicを初期化することもできます。

>>> class Udict:
...     def __init__(self, dic=None):
...         self.data = dict()
...         if dic:
                self.data.update(dic)

それが役に立ったら教えてください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

再帰メソッドがtrueを返す場合、なぜ再帰呼び出しに入るのですか?

分類Dev

bash関数がローカル変数を使用せずに自分自身を再帰的に呼び出すことができるのはなぜですか?

分類Dev

Error()メソッド内でfmt.Sprint(e)を呼び出すと、無限ループになるのはなぜですか?

分類Dev

jprofilerまたはその他:再帰的なメソッド呼び出しをロールアップするにはどうすればよいですか?

分類Dev

Pythonでgetattrメソッドをオーバーライドしているときに無限ループがないのはなぜですか

分類Dev

このメソッドが無限ループに入るのはなぜですか?

分類Dev

アクションメソッドがajax呼び出しからのパラメーターを受け入れないのはなぜですか?

分類Dev

constメソッドからメンバーを変更するメソッドを呼び出すことができるのはなぜですか?

分類Dev

再帰メソッドで値を保持するために静的メンバー変数が機能しないのはなぜですか?

分類Dev

呼び出しがifステートメント内にあるのに、なぜこの再帰メソッドはそれ自体を呼び出し続けるのですか?

分類Dev

tkinterトップレベルの「X」ボタンオーバーライドメソッドが呼び出されないのはなぜですか?

分類Dev

tkinterトップレベルの「X」ボタンオーバーライドメソッドが呼び出されないのはなぜですか?

分類Dev

自分以外のインスタンスでプライベートメソッドを呼び出すことができるのはなぜですか

分類Dev

Angularプロバイダー:useFactoryメソッドが呼び出されないのはなぜですか?

分類Dev

postメソッドを呼び出すと、パスワードが対応するときにifステートメントが入力されますが、ifステートメントのresが無視されるのはなぜですか?

分類Dev

docker関数はsudoを使用するときに自分自身を再帰的に呼び出さないのですか?

分類Dev

再帰的なPython関数では、自分自身を呼び出すコード行の後に続くコード行にどのように到達しますか

分類Dev

Eloquentモデルでメソッドを呼び出すときに、「非静的メソッドを静的に呼び出すべきではない」というメッセージが表示されるのはなぜですか?

分類Dev

基本的な再帰が無限にループするのはなぜですか?

分類Dev

このJavaメソッドの最初のforループを再帰呼び出しに変更するにはどうすればよいですか?

分類Dev

非constメソッドがプライベートのときにpublic constメソッドが呼び出されないのはなぜですか?

分類Dev

finalize()メソッドをオーバーライドするときにsuper.finalize()を呼び出すことが好ましいのはなぜですか?

分類Dev

呼び出しO(h)のバイナリツリーを作成する再帰メソッドのスペースの複雑さはなぜですか?

分類Dev

Perl:サブルーチンAを再帰的に呼び出すことができるのに、以前のAから呼び出されたBからAを呼び出すことができないのはなぜですか?

分類Dev

atexitハンドラーからexitを呼び出すと、無限ループが発生しないのはなぜですか?

分類Dev

ドキュメントを削除するためにクライアントからmeteorサーバーメソッドが呼び出されないのはなぜですか?

分類Dev

Swiftがオーバーロードされたメソッドをより具体的なタイプで呼び出さないのはなぜですか?

分類Dev

メソッド呼び出しの再帰ループ、マッピングに関連しているかどうかわからない

分類Dev

オーバーライドメソッドが呼び出されないのはなぜですか?

Related 関連記事

  1. 1

    再帰メソッドがtrueを返す場合、なぜ再帰呼び出しに入るのですか?

  2. 2

    bash関数がローカル変数を使用せずに自分自身を再帰的に呼び出すことができるのはなぜですか?

  3. 3

    Error()メソッド内でfmt.Sprint(e)を呼び出すと、無限ループになるのはなぜですか?

  4. 4

    jprofilerまたはその他:再帰的なメソッド呼び出しをロールアップするにはどうすればよいですか?

  5. 5

    Pythonでgetattrメソッドをオーバーライドしているときに無限ループがないのはなぜですか

  6. 6

    このメソッドが無限ループに入るのはなぜですか?

  7. 7

    アクションメソッドがajax呼び出しからのパラメーターを受け入れないのはなぜですか?

  8. 8

    constメソッドからメンバーを変更するメソッドを呼び出すことができるのはなぜですか?

  9. 9

    再帰メソッドで値を保持するために静的メンバー変数が機能しないのはなぜですか?

  10. 10

    呼び出しがifステートメント内にあるのに、なぜこの再帰メソッドはそれ自体を呼び出し続けるのですか?

  11. 11

    tkinterトップレベルの「X」ボタンオーバーライドメソッドが呼び出されないのはなぜですか?

  12. 12

    tkinterトップレベルの「X」ボタンオーバーライドメソッドが呼び出されないのはなぜですか?

  13. 13

    自分以外のインスタンスでプライベートメソッドを呼び出すことができるのはなぜですか

  14. 14

    Angularプロバイダー:useFactoryメソッドが呼び出されないのはなぜですか?

  15. 15

    postメソッドを呼び出すと、パスワードが対応するときにifステートメントが入力されますが、ifステートメントのresが無視されるのはなぜですか?

  16. 16

    docker関数はsudoを使用するときに自分自身を再帰的に呼び出さないのですか?

  17. 17

    再帰的なPython関数では、自分自身を呼び出すコード行の後に続くコード行にどのように到達しますか

  18. 18

    Eloquentモデルでメソッドを呼び出すときに、「非静的メソッドを静的に呼び出すべきではない」というメッセージが表示されるのはなぜですか?

  19. 19

    基本的な再帰が無限にループするのはなぜですか?

  20. 20

    このJavaメソッドの最初のforループを再帰呼び出しに変更するにはどうすればよいですか?

  21. 21

    非constメソッドがプライベートのときにpublic constメソッドが呼び出されないのはなぜですか?

  22. 22

    finalize()メソッドをオーバーライドするときにsuper.finalize()を呼び出すことが好ましいのはなぜですか?

  23. 23

    呼び出しO(h)のバイナリツリーを作成する再帰メソッドのスペースの複雑さはなぜですか?

  24. 24

    Perl:サブルーチンAを再帰的に呼び出すことができるのに、以前のAから呼び出されたBからAを呼び出すことができないのはなぜですか?

  25. 25

    atexitハンドラーからexitを呼び出すと、無限ループが発生しないのはなぜですか?

  26. 26

    ドキュメントを削除するためにクライアントからmeteorサーバーメソッドが呼び出されないのはなぜですか?

  27. 27

    Swiftがオーバーロードされたメソッドをより具体的なタイプで呼び出さないのはなぜですか?

  28. 28

    メソッド呼び出しの再帰ループ、マッピングに関連しているかどうかわからない

  29. 29

    オーバーライドメソッドが呼び出されないのはなぜですか?

ホットタグ

アーカイブ