1

オブジェクトを受け取り、それを変更または置換する python 関数があります。

def maybe_replace_corgi(corgi):
  # If corgi is cute enough, modify it to keep it.
  if corgi.cuteness > threshold:
    corgi.will_keep = True
  else:
    # Corgi not cute enough! Instantiate new corgi.
    corgi = Corgi(name="Woofus")

オブジェクトが参照によってPython関数に渡されることを知っています。しかし、関数内のオブジェクトを完全に置き換えたい場合はどうすればよいでしょうか? 私のelseステートメントでやりたいことは?プログラム内のコーギー オブジェクトへのすべての参照が、この新しいコーギー オブジェクトを指すようにするにはどうすればよいですか?

4

2 に答える 2

4

標準的な方法は、新しいコーギーまたは古いコーギーを返すことです。

def maybe_replace_corgi(corgi):
    if corgi.cuteness > threshold:
        corgi.will_keep = True
        return corgi
    else:
        return Corgi(name="Woofus")

my_corgi = Corgi(name="Rudolf")
my_corgi = maybe_replace_corgi(my_corgi)

これの欠点は、他の人が述べているように、すべての参照を置き換えるのではなく、の1つの参照を置き換えるだけですmy_corgi。ただし、すべての参照を置き換えることはできません


オブジェクトへのすべての参照を置き換える代わりに、オブジェクトを編集して新しいオブジェクトのように見せることができます。すべての属性の値を置き換えるだけです。このために、Corgiすべての属性をリセットする新しいメソッドをクラスに作成できます。

ほとんどの場合、新しいメソッドは必要ありませんが、すでに1つあります。__init__メソッドがあまり凝ったことをしない場合(たとえば、Corgi.count変数を増やすなど)、オブジェクトのすべての属性を再初期化するために再度呼び出すことができます。

def maybe_replace_corgi(corgi):
    if corgi.cuteness > treshold:
        corgi.will_keep = true
    else:
        corgi.__init__(name="Woofus")
于 2013-02-09T09:15:27.157 に答える
3

できません。できることは、そのオブジェクトを変更して、(ifステートメントの最初の部分で行うように) 必要な新しい値を持つようにするか、それを返すか、必要なときに他のコードが検索する場所に保存することだけです。値。

たとえば、クラスで作業を行い、常にコーギーを として設定/アクセスする場合、後続の の読み取りは新しい値を読み取るためself.corgi、実行は機能します。同様の効果は、発信者に do を実行させ、古いコーギーまたは新しいコーギーを返すことによって達成できます。self.corgi = Corgi(name="Woofus")self.corgicorgi = maybe_replace_corgi(corgi)maybe_replace_corgi

一般に、「プログラム内のすべての参照をすべて変更する」などのことはできません。同じオブジェクトへの大量の参照を作成せず、代わりに特定のコンテキストで限られた数の参照のみを作成することに賢明であれば、その時が来てもそれらの参照を変更しても問題はありません。

于 2013-02-09T06:53:04.780 に答える