关于函数:没有指针,我可以在Python中将引用作为参数传递吗?

Without pointers, can I pass references as arguments in Python?

本问题已经有最佳答案,请猛点这里访问。

由于Python没有指针,我想知道如何将对对象的引用传递给函数,而不是复制整个对象。这是一个非常做作的例子,但假设我正在编写这样的函数:

1
2
3
4
5
6
7
8
9
def some_function(x):
    c = x/2 + 47
    return c

y = 4
z = 12

print some_function(y)
print some_function(z)

据我所知,当我调用某个_函数(y)时,python会分配新的空间来存储参数值,然后在函数返回c并且不再需要它时擦除该数据。因为我并没有在某个函数中改变参数,我怎么能简单地从函数中引用y而不是在传递时复制y呢?在这种情况下,这并不重要,但是如果y非常大(比如说一个巨大的矩阵),那么复制它可能会占用一些重要的时间和空间。


不幸的是,你的理解是完全错误的。python不复制该值,也不为新值分配空间。它传递的值本身就是对对象的引用。如果修改该对象(而不是重新绑定其名称),则原始对象将被修改。

编辑

我希望你不再担心内存分配:Python不是C++,几乎所有时候你都不需要考虑内存。

通过使用列表之类的东西来演示重新绑定更容易:

1
2
3
4
5
6
7
8
9
10
11
12
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"开始是对原始列表的引用,但随后我们将该名称更改为指向一个新的、不同的列表。


python参数总是"引用"。

python中的参数的工作方式以及在文档中解释这些参数的方式可能会使语言的新手感到困惑和误导,特别是如果您有其他语言的背景,可以在"传递值"和"传递引用"之间进行选择。

在python术语中,"引用"只是一个指针,其中包含更多的元数据以帮助垃圾收集器完成其工作。每个变量和每个参数都是"引用"。

所以,在内部,python向每个参数传递一个"指针"。在这个例子中,您可以很容易地看到:

1
2
3
4
5
6
7
>>> def f(L):
...     L.append(3)
...
>>> X = []
>>> f(X)
>>> X
[3]

变量x指向一个列表,参数l是列表的"指针"的副本,而不是列表本身的副本。

请注意,这与"通过引用"与"EDCOX1"0限定符,或PASCAL与EDCOX1,1"限定符"不相同。