在Python中通过引用传递整数

在Python中通过引用传递整数,python,function,pass-by-reference,pass-by-value,Python,Function,Pass By Reference,Pass By Value,在Python中如何通过引用传递整数 我想修改传递给函数的变量的值。我已经读到Python中的所有内容都是按值传递的,但必须有一个简单的技巧。例如,在Java中,您可以传递Integer、Long等引用类型 如何通过引用将整数传递到函数中 最佳实践是什么 在Python中,所有内容都是按值传递的,但如果要修改某些状态,可以更改传递给方法的列表或对象中整数的值。在Python中,所有内容都是按值传递的,但如果要修改某些状态,您可以更改传递给方法的列表或对象中整数的值。在Python中,这种方式不太

在Python中如何通过引用传递整数

我想修改传递给函数的变量的值。我已经读到Python中的所有内容都是按值传递的,但必须有一个简单的技巧。例如,在Java中,您可以传递
Integer
Long
等引用类型

  • 如何通过引用将整数传递到函数中
  • 最佳实践是什么

  • 在Python中,所有内容都是按值传递的,但如果要修改某些状态,可以更改传递给方法的列表或对象中整数的值。

    在Python中,所有内容都是按值传递的,但如果要修改某些状态,您可以更改传递给方法的列表或对象中整数的值。

    在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.。\uuuuu setitem\uuuuu

    在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.\uuuuu setitem\uuuuu

    实际上,最好的做法是后退一步,询问您是否真的需要这样做。为什么要修改传递给函数的变量的值

    如果您需要快速破解,最快的方法是传递一个包含整数的
    列表,并在每次使用它时都贴上一个
    [0]
    ,正如mgilson的回答所示

    如果你需要做一些更重要的事情,写一个
    ,它有一个
    int
    属性,这样你就可以设置它了。当然,这会迫使您为类和属性想出一个好名字,如果您想不出任何东西,请返回并再次阅读该句子几次,然后使用
    列表


    更一般地说,如果您试图将一些Java习惯用法直接移植到Python,那么您就错了。即使有直接对应的东西(如
    static
    /
    @staticmethod
    ),您仍然不想在大多数Python程序中使用它,因为您要在Java中使用它。

    实际上,最好的做法是退一步,询问您是否真的需要这样做。为什么要修改传递给函数的变量的值

    如果您需要快速破解,最快的方法是传递一个包含整数的
    列表,并在每次使用它时都贴上一个
    [0]
    ,正如mgilson的回答所示

    如果你需要做一些更重要的事情,写一个
    ,它有一个
    int
    属性,这样你就可以设置它了。当然,这会迫使您为类和属性想出一个好名字,如果您想不出任何东西,请返回并再次阅读该句子几次,然后使用
    列表


    更一般地说,如果您试图将一些Java习惯用法直接移植到Python,那么您就错了。即使有直接对应的东西(如
    static
    /
    @staticmethod
    ),您仍然不想在大多数Python程序中使用它,因为您将在Java中使用它。

    在Python中,每个值都是引用(指向对象的指针),就像Java中的非原语一样。此外,与Java一样,Python只有传递值。所以,在语义上,它们几乎是一样的


    既然你在问题中提到了Java,我想看看你是如何用Java实现你想要的东西的。如果你能用Java来展示它,我可以用Python来展示如何完全等价地实现它。

    在Python中,每个值都是一个引用(指向对象的指针),就像Java中的非原语一样。此外,与Java一样,Python只有传递值。所以,在语义上,它们几乎是一样的

    既然你在问题中提到了Java,我想看看你是如何用Java实现你想要的东西的。如果你是c
    def inc_i(v):
        v.i += 1
    
    x = type('', (), {})()
    x.i = 7
    inc_i(x)
    print(x.i)
    
        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)
    
    7
    
    x = 7
    def my_method():
        nonlocal x
        x += 1
    my_method()
    print(x) # 8
    
    import ctypes
    
    def incr(a):
        a += 1
    
    x = ctypes.c_int(1) # create c-var
    incr(ctypes.ctypes.byref(x)) # passing by ref
    
    class Thing:
      def __init__(self,a):
        self.a = a
    def dosomething(ref)
      ref.a += 1
    
    t = Thing(3)
    dosomething(t)
    print("T is now",t.a)