在Python中通过引用传递整数
在Python中如何通过引用传递整数 我想修改传递给函数的变量的值。我已经读到Python中的所有内容都是按值传递的,但必须有一个简单的技巧。例如,在Java中,您可以传递在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中,这种方式不太
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)