【问题标题】:Python: Reassign value to variable (using a function) [duplicate]Python:将值重新分配给变量(使用函数)[重复]
【发布时间】:2012-12-07 21:16:06
【问题描述】:

可能重复:
Python: How do I pass a variable by reference?

如何将值重新分配给作为函数参数传递的变量?

例如,我想做的是:

foo = True

def convert(foo):
    if foo == True:
        foo = 'on'
    elif foo == False:
        foo = 'off'
    return foo

foo 现在是一个字符串。上述方法的问题在于,为了将 foo 从布尔类型更改为字符串类型,必须传递以下内容:

foo = convert(foo)

而我正在做类似的事情:

convert(foo)

或者,

foo.convert()

有什么想法吗?

【问题讨论】:

  • 听起来你想要这个:stackoverflow.com/q/986006/21475。此外,值得一读 Python 的 global 关键字(但在这里并不适用)。
  • 查看 Lev 对最干净(也是最正确)解决方案的回答。如果您坚持能够更改对象而不返回它,请将其包装在类或字典中(例如,一个简单的技巧是使用 foo={True} 并传递它)。

标签: python function variables python-2.7


【解决方案1】:
foo = convert(foo)

是实现这一目标的最简洁和最明确的方式。如果您确定甚至需要将字符串重新分配给 bool 变量,这是大多数人推荐的方式。

foo.convert()

是您可以在需要定义的类的实例上执行的操作。你可以做到,但这不值得麻烦。只需重新分配变量,就可以了。

convert(foo) # actually, just convert()

也可以,但您必须在convert 函数中使用global 关键字。不建议这样做,尤其是当它很容易避免时。

In [1]: foo = True

In [2]: def convert():
   ...:    global foo
   ...:    foo = 'on' if foo else 'off'
   ...:     

In [3]: convert()

In [4]: foo
Out[4]: 'on'

【讨论】:

  • 它不仅是最干净的,而且没有对命名空间进行一些极其混乱的黑客攻击,这几乎不可能适用于所有用例,这是不可能的。至于第二个,除非你在 object 上做猴子补丁 convert() 之类的事情(这将是一个非常糟糕的主意),也是不可能的。
  • @sr2222 我也不确定如何通过猴子补丁来实现这一点。我的意思是,该方法不能重新分配它的所有者,对吧?但是可以通过定义一个类来完成一些事情,但可能涉及对其余代码的一些更改。无论如何,即使考虑它也绝对是个坏主意。编辑:我不明白你的意思是object,而不仅仅是“对象”。不过,仍然不确定它有什么帮助。
  • 您可以将 convert() 修改为 object 本身,这意味着每个没有自己的 convert 的对象(至少是新样式和大多数内置对象)现在都将有你定义的convert 方法。由于foo 的类型是未定义的,实际上无法定义,在OP 的场景中,添加这个甚至接近普遍的唯一方法是做一个非常糟糕的事情并直接与object 搞砸。尽管如此,将转换后的值实际推送回标签中的任何命名空间 convert 没有显式赋值,这将是一些非常棘手的代码。
  • 可能根本不可能做我们正在谈论的事情。尽管考虑到这将是一个非常糟糕的想法,但我并不特别倾向于尝试弄清楚。 ;)
猜你喜欢
  • 2015-11-19
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
相关资源
最近更新 更多