【发布时间】: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
给定一个函数:
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
您进入了一个模糊的领域:您正在谈论在函数中声明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
【讨论】:
如果c 是一个列表,您可以这样做:
c = [2]
def A(a, b, c):
a *= 2
b *= 4
c[0] *= 8
return a+b+c[0]
print c # gives [16]
【讨论】:
你不能。 Python 做不到。
您可以做的是传递一个定义了__imul__() 和一个嵌入的int 的包装器,而增强的赋值将导致嵌入的属性被改变。
【讨论】:
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
A = C(1)
print A(1, 1), A.c
print A(1, 1), A.c
14 8
70 64
【讨论】: