在Python中,我可以在没有指针的情况下把引用作为参数传递吗?
在Python中,我可以在没有指针的情况下把引用作为参数传递吗?
这个问题已经在这里找到了答案::如何通过引用传递变量?
由于Python没有指针,我想知道如何通过将引用传递到函数中而不是复制整个对象来传递对象的引用。这是一个非常人为的例子,但是假设我正在编写这样一个函数:
def some_function(x): c = x/2 + 47 return c y = 4 z = 12 print some_function(y) print some_function(z)
据我了解,当我调用some_function(y)时,Python会分配新空间来存储参数值,一旦函数返回c且不再需要该数据,就会清除这些数据。由于我实际上没有在some_function中更改参数,因此在传递时如何简单地从函数内部引用y而不是复制y?在这种情况下,这并不重要,但如果y非常大(例如一个巨大的矩阵),复制它可能会占用一些显着的时间和空间。
Python参数总是“引用”。
Python中参数的工作方式以及在文档中的解释可能会对这门语言的新手造成困惑和误导,特别是如果你有从其他允许你选择“按值传递”和“按引用传递”的语言背景。
在Python术语中,一个“引用”只是一个指针,带有一些元数据以帮助垃圾回收器完成它的工作。每个变量和每个参数都是“引用”。
因此,从内部来看,Python会将一个“指针”传递给每个参数。你可以很容易地在这个例子中看到这一点:
>>> def f(L): ... L.append(3) ... >>> X = [] >>> f(X) >>> X [3]
变量X指向一个列表,参数L是列表的“指针”的一个副本,而不是列表本身的副本。
请注意,这与使用C++中的&
限定符或Pascal中的var
限定符的“按引用传递”不同。
很遗憾,您对Python的理解完全错误。Python不会复制值,也不会为其分配新空间,它传递的是一个值本身就是对象的引用。如果您修改该对象(而不是重新绑定其名称),则原始对象将被修改。
编辑
我希望您停止担心内存分配:Python不是C ++,在大多数时候您不需要考虑内存。
可以通过使用列表等东西来演示重新绑定:
def my_func(foo): foo.append(3) # now the source list also has the number 3 foo = [3] # we've re-bound 'foo' to something else, severing the relationship foo.append(4) # the source list is unaffected return foo original = [1, 2] new = my_func(original) print original # [1, 2, 3] print new # [3, 4]
如果您从名称而非变量的角度考虑,可能会更容易:在函数内部,名称“foo”最初是指向原始列表的引用,然后我们将该名称更改为指向一个新的、不同的列表。