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

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

您不能。您可以做的唯一事情是对该对象进行变异,使其具有所需的新值(就像您在
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.increase
Corgi.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.increase
Corgi.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,它就会提供这种行为。