如何在Python中通过引用传递整数?
我想修改我传递给函数的变量的值。我已经阅读过Python中的所有内容都是按值传递,但肯定有一个简单的技巧。例如,在Java中,您可以传递Integer
,Long
等引用类型。
- 如何通过引用将整数传递到函数中?
- 最佳实践是什么?
如何在Python中通过引用传递整数?
我想修改我传递给函数的变量的值。我已经阅读过Python中的所有内容都是按值传递,但肯定有一个简单的技巧。例如,在Java中,您可以传递Integer
,Long
等引用类型。
def change(x):
x[0] = 3
x = [1]
change(x)
print x
=
)将右侧的对象绑定到左侧的任何内容(或传递给适当的函数)。def multiply_by_2(x):
return 2*x
x = 1
x = multiply_by_2(x)
3
传递给了x.__setitem__
。PyObject
。当您调用python函数时,python不知道(也不关心)正在传递的类型。实际上,您可以多次使用不同类型调用相同的函数(考虑内置的str
)。我认为,在函数接口层面上没有针对原语的特殊情况。是的,这是python函数调用比较昂贵的原因之一。 - mgilsondef 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
不是直接传递一个值,而是像传递了一个值一样使用它。
x = 7
def my_method():
nonlocal x
x += 1
my_method()
print(x) # 8
注意事项:
nonlocal
是在 Python 3 中引入的。global
而不是 nonlocal
。import ctypes
def incr(a):
a += 1
x = ctypes.c_int(1) # create c-var
incr(ctypes.ctypes.byref(x)) # passing by ref
实际上,最好的做法是退一步并问问自己是否真的需要这样做。 为什么你想修改传递给函数的变量的值?
如果你需要为了快速解决问题而这样做,最快的方法是传递一个包含整数的list
,并在每次使用它时添加[0]
,就像mgilson的答案所示。
如果您需要为某些更重要的事情这样做,请编写一个具有int
属性的class
,以便您可以轻松设置它。当然,这迫使您想出一个好的类名和属性名称-如果您想不出任何东西,请再次阅读几遍该句子,然后使用list
。
更一般地说,如果您试图直接将某些Java习惯用法移植到Python,则您正在错误地这样做。即使存在一些直接对应的内容(如static
/@staticmethod
),在大多数Python程序中,您仍然不希望使用它,就像您在Java中使用它一样。
Numpy单元素数组是可变的,但对于大多数情况来说,它可以像一个python数字变量一样进行评估。因此,它比单元素列表更方便作为引用类型的数字容器。
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
正确的答案是使用类并将值放在类内,这样可以按照您所需的方式通过引用传递。
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)
def inc_i(v):
v.i += 1
x = type('', (), {})()
x.i = 7
inc_i(x)
print(x.i)
class PassByReference:
def Change(self, var):
self.a = var
print(self.a)
s=PassByReference()
s.Change(5)