通过引用在Python传递一个整数(Passing an integer by reference

2019-07-20 18:35发布

我怎么可以在Python参考整数关口?

我想修改我传递给函数的变量的值。 我已阅读,一切都在Python是按值传递,但必须有一个简单的伎俩。 例如,在Java中,你可以通过引用类型的IntegerLong等。

  1. 我怎样才能整数关口进入一个函数引用?
  2. 什么是最好的做法?

Answer 1:

这并不完全工作在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__



Answer 2:

在这里你将需要按引用传递大多数情况下,你需要返回多个值返回给调用者。 A“最佳实践”是使用多个返回值,这比像Java语言更容易在Python做。

这里有一个简单的例子:

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


Answer 3:

说真的,最好的做法是退后一步,问你是否真的需要做到这一点。 为什么要修改您传递给函数的变量的值?

如果你需要做一个快速的黑客,最快的方法是通过一个list拿着整数,并坚持一个[0]周围的每一个使用它,因为mgilson的回答证明。

如果你需要做更多的东西显著,写一个class有一个int作为一个属性,所以你可以设置它。 当然,这迫使你想出一个好名字的类,并为属性,如果你不能想到的任何东西,回去再读一句几次,然后用list

更一般地,如果你想直接到端口一些Java成语到Python,你这样做是错误的。 即使有一些直接对应的(如static / @staticmethod ),你还是不要想用它在大多数的Python程序仅仅因为你在Java中使用它。



Answer 4:

在Python,每一个值是一个参考(指针的对象),就像在Java中的非原语。 此外,像Java,Python中只有按值传递。 所以,语义,它们几乎相同。

既然你在你的问题提的Java,我想看看你是如何达到你在Java中想要什么。 如果你能在Java中表现出来,我可以告诉你如何做到这一点恰好等同于Python的。



Answer 5:

class PassByReference:
    def Change(self, var):
        self.a = var
        print(self.a)
s=PassByReference()
s.Change(5)     


Answer 6:

numpy的单元素数组是可变的,但对于大多数用途,它可以被就好像它是一个数值蟒变量进行评价。 因此,它比单元素列表中的更方便的通过引用编号容器。

    import numpy as np
    def triple_var_by_ref(x):
        x[0]=x[0]*3
    a=np.array([2])
    triple_var_by_ref(a)
    print(a+1)

输出:

3


Answer 7:

不完全是直接传递一个值,但使用它,如果它获得通过。

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

注意事项:

  • nonlocal被在Python 3引入
  • 如果封闭范围是全局的,使用global而不是nonlocal


Answer 8:

也许稍微自我记录比列表的长度1,关键是老空类型绝招:

def inc_i(v):
    v.i += 1

x = type('', (), {})()
x.i = 7
inc_i(x)
print(x.i)


Answer 9:

在Python中,一切都按值传递的,但如果你想修改一些状态,您可以变更传递给方法列表或对象内部的整数值。



文章来源: Passing an integer by reference in Python