【问题标题】:call-by-reference function parameters引用调用函数参数
【发布时间】:2012-02-26 00:08:24
【问题描述】:

给定一个函数:

def A(a, b, c):
    a *= 2
    b *= 4
    c *= 8
    return a+b+c

如何将'c' var 设置为通过引用调用,所以如果我调用d = A(a,b,c),c 将指向同一个 int 对象,并在函数内进行更新?

【问题讨论】:

标签: python


【解决方案1】:

您进入了一个模糊的领域:您正在谈论在函数中声明global(或nonlocal)变量,这根本不应该这样做。函数旨在做一件事,并且在没有其他值或影响其状态或输出的函数同意的情况下执行它们。

很难提出一个可行的示例:您可以保留变量的副本以供以后参考吗?您可以扩展此代码以传回 tuple,并在需要时引用 tuple 的成员或总和:

>>> def A(a, b, c):
        return (a*2, b*4, c*8)

>>> d = A(2, 4, 8)
>>> sum(d)
84
>>> d[-1] #or whatever index you'd need...this may serve best as a constant
64

【讨论】:

    【解决方案2】:

    如果c 是一个列表,您可以这样做:

    c = [2]
    def A(a, b, c):
        a *= 2
        b *= 4
        c[0] *= 8
        return a+b+c[0]
    print c  # gives [16]
    

    【讨论】:

      【解决方案3】:

      你不能。 Python 做不到。

      可以做的是传递一个定义了__imul__() 和一个嵌入的int 的包装器,而增强的赋值将导致嵌入的属性被改变。

      【讨论】:

        【解决方案4】:

        Python 中的所有调用都是“通过引用”的。整数在 Python 中是不可变的。您无法更改它们。

        class C:
           def __init__(self, c):
               self.c = c
           def __call__(self, a, b):
               a *= 2
               b *= 4
               self.c *= 8
               return a + b + self.c
        

        Example

        A = C(1)
        print A(1, 1), A.c
        print A(1, 1), A.c
        

        输出

        14 8
        70 64
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多