【问题标题】:python: how to change the value of function's input parameter?python:如何更改函数的输入参数的值?
【发布时间】:2019-08-11 23:51:09
【问题描述】:

我尝试在函数中修改字符串的值,如下所示:

>>> def appendFlag(target, value):
...     target += value
...     target += " "
...
>>> appendFlag
<function appendFlag at 0x102933398>
>>> appendFlag(m,"ok")
>>> m
''

好吧,似乎“目标”只在函数内部发生了变化,但是如何使新值在函数外部可行?谢谢。

【问题讨论】:

  • return它。也许?
  • @DirtyBit,这显然不适用于 __init__ 方法。
  • 如果你需要维护一个程序:这是 Python 最缺的可能。多久(在其他语言和“源 == 文档”中)更改参数值不会导致数小时的调试发现错误?

标签: python function parameters reference mutable


【解决方案1】:

这是在python中通过返回来处理的。

def appendFlag(target, value):
   target += value
   target += " "
   return target

你可以这样使用它:

m = appendFlag(m,"ok")

你甚至可以像这样返回几个变量:

def f(a,b):
   a += 1
   b += 1
   return a,b

并像这样使用它:

a,b = f(4,5)

【讨论】:

    【解决方案2】:

    你需要使用一个可以修改的对象

    >>> m = []
    >>> def appendFlag(target, value):
    ...     target.append(value)
    ...     target.append(" ")
    ...
    >>> appendFlag(m, "ok")
    >>> m
    ['ok', ' ']
    

    【讨论】:

      【解决方案3】:

      函数内部的变量只有函数作用域,如果你从函数内部改变变量的值,它不会反映在函数外部。如果要更改全局变量 m 的值,请从函数外部对其进行更新,如下所示

       def appendFlag(target, value):
              target += value
              target += " "
              return target
        m=''
        m=appendFlag(m,'ok')
      

      【讨论】:

        【解决方案4】:

        可变数据类型,例如列表或字典,可以在函数内部更改而无需返回:

        def duplicate_last(l):
            l.append(l[-1])
        
        l = [1, 2, 3]
        duplicate_last(l)
        

        原因是python中可变和不可变对象的内存管理不同。

        【讨论】:

          【解决方案5】:

          您的函数需要返回新值。 target 变量仅在 appendFlag 函数内具有作用域。

          def appendFlag(target, value):
             ...
             return target
          
          m = appendFlag(m, "ok")
          

          【讨论】:

            【解决方案6】:

            创建一个新类并将目标设置为类的成员。然后尝试 setattr(class, 'target', value)。

            【讨论】:

            • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
            猜你喜欢
            • 2021-05-10
            • 2015-11-27
            • 2015-03-28
            • 2018-07-25
            • 1970-01-01
            • 1970-01-01
            • 2023-03-14
            • 1970-01-01
            • 2018-08-10
            相关资源
            最近更新 更多