3 回答
TA贡献1856条经验 获得超5个赞
它在Python中并不是那么有用。Python传递对象的引用。在你的函数里面你有一个对象 - 你可以自由地改变那个对象(如果可能的话)。但是,整数是不可变的。一种解决方法是在可以变异的容器中传递整数:
def change(x): x[0] = 3x = [1]change(x)print x
这充其量是丑陋/笨拙的,但你不会在Python中做得更好。原因是因为在Python中,assign(=
)接受任何对象是右侧的结果,并将其绑定到左侧的任何对象*(或将其传递给适当的函数)。
理解这一点,我们可以看到为什么没有办法在函数内部改变不可变对象的值 - 你不能改变它的任何属性,因为它是不可变的,你不能只是将“变量”分配给一个新的值因为那时你实际上是在创建一个新对象(与旧对象不同)并为它赋予旧对象在本地名称空间中的名称。
通常,解决方法是简单地返回您想要的对象:
def multiply_by_2(x): return 2*x x = 1x = multiply_by_2(x)
*在上面的第一个示例中,3
实际上传递给了x.__setitem__
。
TA贡献2016条经验 获得超9个赞
您需要通过引用传递的大多数情况是您需要将多个值返回给调用者的位置。“最佳实践”是使用多个返回值,这在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 oncer, theta = RectToPolar(3, 4) # assign 2 things at once
TA贡献1804条经验 获得超7个赞
真的,最好的做法是退后一步,询问你是否真的需要这样做。为什么要修改传递给函数的变量的值?
如果你需要快速进行黑客攻击,那么最快的方法是传递一个list
持有整数,并坚持[0]
使用它,就像mgilson的回答所示。
如果你需要为更重要的事情做一些事情,那就写一个class
具有int
属性的东西,这样你就可以设置它。当然这会迫使你为这个类提出一个好名字,对于属性 - 如果你想不出任何东西,那就回去再读一遍这句话,然后再使用list
。
更一般地说,如果你试图将一些Java习惯用法直接移植到Python,你就错了。即使存在直接对应的东西(与static
/一样@staticmethod
),你仍然不想在大多数Python程序中使用它,因为你在Java中使用它。
添加回答
举报