Python通过引用传递一个整数
如何在Python中通过引用传递一个整数? 我想修改我传递给函数的variables的值。 我已经读过,Python中的所有东西都是按照价值传递的,但是必须有一个简单的技巧。 例如,在Java中,您可以传递Integer
, Long
等引用types
- 我怎样才能通过引用传递一个整数到一个函数?
- 什么是最佳实践?
谢谢!
这在Python中并不是那么有效。 Python传递对象的引用。 你的函数里面有什么是一个对象 – 你可以自由地改变这个对象(如果可能的话)。 但是,整数是不变的 。 一个解决方法是将一个容器中的整数传递给可以被突变的:
def change(x): x[0] = 3 x = [1] change(x) print x
这是最好的丑陋/笨拙,但你不会在Python中做得更好。 原因是因为在Python中,赋值( =
)将右侧的结果作为对象,并将其绑定到左侧的任何对象*(或者将其传递给适当的函数)。 理解这一点,我们可以看到为什么没有办法改变函数内的不可变对象的值 – 你不能改变它的任何属性,因为它是不可变的,你不能只给“variables”赋一个新的值因为那么你实际上正在创build一个新的对象(与旧的对象不同),并给它一个旧对象在本地名称空间中的名称。
通常,解决方法是简单地返回所需的对象:
def multiply_by_2(x): return 2*x x = 1 x = multiply_by_2(x)
*在上面的第一个例子中, 3
实际上被传递给了x.__setitem__
大多数情况下,你需要通过引用传递是你需要返回多个值返回给调用者。 “最佳实践”是使用多个返回值,这在Python中比在像Java这样的语言中要容易得多。
这是一个简单的例子:
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
真的,最好的做法是退一步,问你是否真的需要这样做。 你为什么要修改你传递给函数的variables的值?
如果你需要做一个快速的黑客攻击,最快的方法就是通过一个包含整数的list
,并且在每次使用的时候粘贴一个[0]
,正如mgilson的答案所表明的那样。
如果你需要做更重要的事情,写一个int
class
作为属性的类,所以你可以设置它。 当然,这会迫使你为课堂提出一个好名字,而对于属性 – 如果你想不出任何东西,回去再读几遍,然后使用list
。
更一般地说,如果你试图把一些Java语言直接移植到Python,那么你就错了。 即使有什么东西直接对应(就像static
/ @staticmethod
),你仍然不想在大多数Python程序中使用它,仅仅是因为你在Java中使用它。
class PassByReference: def Change(self, var): self.a = var print(self.a) s=PassByReference() s.Change(5)
在Python中,每个值都是引用(指向对象的指针),就像Java中的非原语一样。 而且,像Java一样,Python只有传递价值。 所以,在语义上,他们几乎是一样的。
既然你提到Java的问题,我想看看你如何实现你想要的Java。 如果你能用Java来展示它,我可以告诉你如何在Python中完全等价地实现它。
也许稍微更自我的文件,然后长度列表1技巧是醇'空的types的伎俩:
def inc_i(v): vi += 1 x = type('', (), {})() xi = 7 inc_i(x) print(xi)
8
在python中,所有东西都是按值传递的,但是如果你想修改某个状态,你可以改变传递给方法的列表或对象中的整数值。