我怎么可以在Python参考整数关口?
我想修改我传递给函数的变量的值。 我已阅读,一切都在Python是按值传递,但必须有一个简单的伎俩。 例如,在Java中,你可以通过引用类型的Integer
, Long
等。
- 我怎样才能整数关口进入一个函数引用?
- 什么是最好的做法?
我怎么可以在Python参考整数关口?
我想修改我传递给函数的变量的值。 我已阅读,一切都在Python是按值传递,但必须有一个简单的伎俩。 例如,在Java中,你可以通过引用类型的Integer
, Long
等。
这并不完全工作在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__
。
在这里你将需要按引用传递大多数情况下,你需要返回多个值返回给调用者。 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
说真的,最好的做法是退后一步,问你是否真的需要做到这一点。 为什么要修改您传递给函数的变量的值?
如果你需要做一个快速的黑客,最快的方法是通过一个list
拿着整数,并坚持一个[0]
周围的每一个使用它,因为mgilson的回答证明。
如果你需要做更多的东西显著,写一个class
有一个int
作为一个属性,所以你可以设置它。 当然,这迫使你想出一个好名字的类,并为属性,如果你不能想到的任何东西,回去再读一句几次,然后用list
。
更一般地,如果你想直接到端口一些Java成语到Python,你这样做是错误的。 即使有一些直接对应的(如static
/ @staticmethod
),你还是不要想用它在大多数的Python程序仅仅因为你在Java中使用它。
在Python,每一个值是一个参考(指针的对象),就像在Java中的非原语。 此外,像Java,Python中只有按值传递。 所以,语义,它们几乎相同。
既然你在你的问题提的Java,我想看看你是如何达到你在Java中想要什么。 如果你能在Java中表现出来,我可以告诉你如何做到这一点恰好等同于Python的。
class PassByReference:
def Change(self, var):
self.a = var
print(self.a)
s=PassByReference()
s.Change(5)
甲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
不完全是直接传递一个值,但使用它,如果它获得通过。
x = 7
def my_method():
nonlocal x
x += 1
my_method()
print(x) # 8
注意事项:
nonlocal
被在Python 3引入 global
而不是nonlocal
。 也许稍微自我记录比列表的长度1,关键是老空类型绝招:
def inc_i(v):
v.i += 1
x = type('', (), {})()
x.i = 7
inc_i(x)
print(x.i)
在Python中,一切都按值传递的,但如果你想修改一些状态,您可以变更传递给方法列表或对象内部的整数值。