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 声明中做的那样?如何在我的程序中使所有对 corgi 对象的引用都指向这个新的 corgi 对象?

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)

正如其他人所提到的,这样做的缺点是:它不会替换所有引用,它只会替换my_corgi. 但是,不可能替换所有引用


无需替换对对象的所有引用,您只需编辑对象以使其看起来像一个新对象。只需替换它的所有属性值。为此,您可以在Corgi类中创建一个新方法,该方法会重置所有属性。

在大多数情况下,您不需要方法,您已经有了一个:如果您的__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,那么 doingself.corgi = Corgi(name="Woofus")将起作用,因为后续读取的self.corgi将读取新值。corgi = maybe_replace_corgi(corgi)通过让调用者执行并maybe_replace_corgi返回旧的柯基犬或新的柯基犬,可以实现类似的效果。

通常,您不能执行“更改程序中所有位置的所有引用”之类的操作。如果您明智地不创建对同一对象的大量引用,而是仅在特定上下文中创建有限数量的引用,那么在时机成熟时更改这些引用将毫无问题。

于 2013-02-09T06:53:04.780 回答