如何在Python中通过引用传递整数?
我想修改传递给函数的变量的值。我读过Python中的所有内容都是按值传递的,但是必须有一个简单的技巧。例如,在Java中,你可以通过引用类型的Integer
,Long
等等。
- 如何通过引用将整数传递给函数?
- 最佳做法是什么?
如何在Python中通过引用传递整数?
我想修改传递给函数的变量的值。我读过Python中的所有内容都是按值传递的,但是必须有一个简单的技巧。例如,在Java中,你可以通过引用类型的Integer
,Long
等等。
Answers:
在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__
。
C
。(例如,不必取消引用它们)。在我的思维模型中,将事物视为“名称”和“对象”会更容易。分配将左侧的“名称”绑定到右侧的“对象”。调用函数时,将传递“对象”(有效地将其绑定到函数中的新本地名称)。
.
操作员只需取消引用左侧即可。运算符在不同的语言中可以不同。
确实,最佳做法是退后一步,然后询问您是否真的需要这样做。为什么要修改传递给函数的变量的值?
如果您需要快速破解,最快的方法是传递一个list
整数,并粘贴[0]
如mgilson的答案所示,在每次使用时使用。
如果您需要做一些更重要的事情,请写一个 class
具有int
作为属性的,以便您可以对其进行设置。当然,这会迫使您为类和属性命名,如果您什么都没想到,请返回并再次阅读该句子几次,然后使用list
。
更一般而言,如果您尝试将某些Java习惯用法直接移植到Python,那么您做错了。即使有直接对应的内容(如static
/ @staticmethod
),您仍然不想在大多数Python程序中使用它,只是因为您要在Java中使用它。
甲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
也许这不是pythonic的方式,但是您可以这样做
import ctypes
def incr(a):
a += 1
x = ctypes.c_int(1) # create c-var
incr(ctypes.ctypes.byref(x)) # passing by ref
可能比length-1列表技巧更能自我记录的是旧的空类型技巧:
def inc_i(v):
v.i += 1
x = type('', (), {})()
x.i = 7
inc_i(x)
print(x.i)
在Python中,所有内容均按值传递,但如果要修改某些状态,则可以更改传递给方法的列表或对象内的整数值。
everything is passed by value
这不是真的。引用文档:arguments are passed using call by value (where the value is always an object reference, not the value of the object)