我有一个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对象?
答案 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>