Python 如何更改变量在函数中指向的位置?
我有一个python函数,它接受一个对象并对其进行修改或替换Python 如何更改变量在函数中指向的位置?,python,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 = C
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对象?您不能。您可以做的唯一事情是对该对象进行变异,使其具有所需的新值(就像您在
if
语句的第一部分中所做的那样),或者返回该对象,或者将其存储在其他代码需要该值时将查找该对象的某个位置
例如,如果您在类中执行工作,并且始终将corgi设置为self.corgi
,则执行self.corgi=corgi(name=“Woofus”)
将有效,因为后续读取self.corgi
将读取新值。通过让调用者执行corgi=maybe\u replace\u corgi(corgi)
,并让maybe\u replace\u corgi
返回旧的corgi或新的corgi,可以实现类似的效果
一般来说,您不能执行“更改程序中所有地方的引用”之类的操作。如果您明智地不创建对同一对象的大量引用,而是在特定上下文中只创建有限数量的引用,那么在时机成熟时更改这些引用是没有问题的。您不能。您可以做的唯一事情是对该对象进行变异,使其具有所需的新值(就像您在
if
语句的第一部分中所做的那样),或者返回该对象,或者将其存储在其他代码需要该值时将查找该对象的某个位置
例如,如果您在类中执行工作,并且始终将corgi设置为self.corgi
,则执行self.corgi=corgi(name=“Woofus”)
将有效,因为后续读取self.corgi
将读取新值。通过让调用者执行corgi=maybe\u replace\u corgi(corgi)
,并让maybe\u replace\u corgi
返回旧的corgi或新的corgi,可以实现类似的效果
一般来说,您不能执行“更改程序中所有地方的引用”之类的操作。如果您明智地不创建对同一对象的大量引用,而是在特定上下文中只创建有限数量的引用,那么在时机成熟时更改这些引用是没有问题的。标准方法是返回新的corgi或旧的corgi:
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
类中创建一个新方法,该方法重置所有属性
def maybe_replace_corgi(corgi):
if corgi.cuteness > treshold:
corgi.will_keep = true
else:
corgi.__init__(name="Woofus")
在大多数情况下,您不需要一个新方法,您已经有了一个:如果您的\uuuu init\uuuu
方法没有做任何太花哨的事情(fe.increaseCorgi.count
变量或诸如此类),可以再次调用它来重新初始化对象的所有属性
def maybe_replace_corgi(corgi):
if corgi.cuteness > treshold:
corgi.will_keep = true
else:
corgi.__init__(name="Woofus")
标准的方法是返回一个新的科基犬或旧的科基犬:
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
类中创建一个新方法,该方法重置所有属性
def maybe_replace_corgi(corgi):
if corgi.cuteness > treshold:
corgi.will_keep = true
else:
corgi.__init__(name="Woofus")
在大多数情况下,您不需要一个新方法,您已经有了一个:如果您的\uuuu init\uuuu
方法没有做任何太花哨的事情(fe.increaseCorgi.count
变量或诸如此类),可以再次调用它来重新初始化对象的所有属性
def maybe_replace_corgi(corgi):
if corgi.cuteness > treshold:
corgi.will_keep = true
else:
corgi.__init__(name="Woofus")
标准做法是让此函数返回要使用的新corgi值,要么是传入的相同值,要么是替换的值。@Dougal:当然,但这不会“更改”该对象的所有引用。当然不会,只是指出通常的处理方法。标准做法是让此函数返回要使用的新corgi值,要么是传入的同一个值,要么是替换的值。@Dougal:当然,但这不会“更改所有引用”该对象。当然不会,只是指出你通常是如何处理的。你可以在这里使用这个语句。@AshwiniChaudhary只在非常特定的情况下使用。@FWIW,ruby在你真正需要的时候提供这个行为。你可以在这里使用这个语句。@AshwiniChaudhary只在非常特定的情况下使用。@FWIW,如果您真的需要ruby,它就会提供这种行为。