在Python中按引用传递整数

140 投票
13 回答
187992 浏览
提问于 2025-04-17 17:31

我该如何在Python中通过引用传递一个整数?

我想修改一个我传给函数的变量的值。我听说在Python中所有东西都是按值传递,但一定有简单的方法可以做到这一点。例如,在Java中,你可以传递IntegerLong等的引用类型。

  1. 我该如何通过引用将一个整数传递给函数?
  2. 有什么好的实践方法?

13 个回答

20

并不是直接传递一个值,而是把它当作已经传递的来使用。

x = 7
def my_method():
    nonlocal x
    x += 1
my_method()
print(x) # 8

注意事项:

  • nonlocal 是在 Python 3 中引入的。
  • 如果外层作用域是全局的,那就要用 global,而不是 nonlocal
35

通常情况下,你需要通过引用传递的情况是当你想要把多个值返回给调用者的时候。一个“最佳实践”是使用多个返回值,这在Python中比在Java等语言中要简单得多。

下面是一个简单的例子:

def RectToPolar(x, y):
    r = (x ** 2 + y ** 2) ** 0.5
    theta = math.atan2(y, x)
    return r, theta # return 2 things at once

r, theta = RectToPolar(3, 4) # assign 2 things at once
160

在Python中,事情并不是这样运作的。Python传递的是对象的引用。在你的函数内部,你有一个对象——你可以自由地修改这个对象(如果可以的话)。不过,整数是不可变的。一种解决办法是把整数放在一个可以被修改的容器里:

def change(x):
    x[0] = 3

x = [1]
change(x)
print x

这方法说实话有点笨拙,但在Python中也没有更好的办法。原因是,在Python中,赋值(=)会把右边的对象绑定到左边的变量上(或者传递给相应的函数)。

理解了这一点,我们就能明白为什么在函数内部无法改变不可变对象的值——你不能改变它的任何属性,因为它是不可变的;而且你也不能简单地给“变量”赋一个新值,因为那样实际上是在创建一个新对象(这个新对象和旧的不同),然后把旧对象的名字给了这个新对象。

通常的解决办法就是简单地返回你想要的对象:

def multiply_by_2(x):
    return 2*x

x = 1
x = multiply_by_2(x)

*在上面的第一个例子中,3实际上是被传递给了x.__setitem__

撰写回答