如何更改变量在函数中指向的位置?

时间:2013-02-09 06:50:25

标签: python

我有一个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函数的。但是如果我想完全替换函数中的对象呢?我想在其他声明中做什么?如何在程序中对corgi对象的所有引用都指向这个新的corgi对象?

2 个答案:

答案 0 :(得分: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类中创建一个新方法,该方法将重置所有属性。

在大多数情况下,你不需要 new 方法,你已经有了一个方法:如果你的__init__方法没有做任何太花哨的事情(fe。增加{{1}可以再次调用它来重新初始化所有对象的属性。

Corgi.count

答案 1 :(得分:3)

你做不到。您可以做的唯一事情是改变该对象,使其具有您想要的新值(就像您在if语句的第一部分中所做的那样),或者将其返回,或者将其存储在其他代码看起来的位置因为它想要价值。

例如,如果你在一个班级中完成工作,并且始终将corgi设置/访问为self.corgi,则执行self.corgi = Corgi(name="Woofus")将起作用,因为后续读取self.corgi将会读取新的价值。通过让呼叫者执行corgi = maybe_replace_corgi(corgi)并让maybe_replace_corgi返回旧的小狗或新的小狗,可以实现类似的效果。

一般情况下,您无法执行“更改程序中所有引用”的操作。如果您明智地没有创建大量对同一对象的引用,而是在特定上下文中仅创建有限数量的引用,那么在时机成熟时更改这些引用会没有问题。 / p>