如果没有指针,我可以在Python中作为参数传递引用吗?

如果没有指针,我可以在Python中作为参数传递引用吗?,python,function,pointers,memory,Python,Function,Pointers,Memory,由于Python没有指针,我想知道如何将对对象的引用传递给函数,而不是复制整个对象。这是一个非常做作的示例,但假设我正在编写这样一个函数: 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并且不再需要它时删除这些数据。既然

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

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呢?在这种情况下,这并不重要,但如果y非常大(比如一个巨大的矩阵),复制它可能会占用一些重要的时间和空间。

不幸的是,你的理解完全错误。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”一开始是对原始列表的引用,但随后我们将该名称更改为指向一个新的、不同的列表。

Python参数始终是“引用”

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

在Python术语中,“引用”只是一个指针,带有更多元数据以帮助垃圾收集器完成其工作。每个变量和参数都是“引用”

因此,Python在内部向每个参数传递一个“指针”。在本例中,您可以很容易地看到这一点:

>>> def f(L):
...     L.append(3)
... 
>>> X = []
>>> f(X)
>>> X
[3]
变量X指向一个列表,参数L是列表“指针”的副本,而不是列表本身的副本


<>注意,这与“C++”和“<代码> >代码>限定符,或PASCAL与<代码> var >代码>限定符不一样。

文档:我在这失败的时候有过一些记述。主要是在处理类和线程时。@Torxed这应该永远不会失败,因为Python总是这样工作的。如果您使用的是线程,我猜导致您的编码问题的最可能的原因是线程问题。可能是,是发生了一段时间。@vz0我认为这意味着我实际上没有将数据从y或z复制到我的函数中——我只是传递了一个“指针”。Python分配新内存的唯一时间是,如果我在某个_函数中对y或z\emph{in}进行了变异。所以,只要我没有在函数中对其进行变异,我就不会减慢我的程序的速度。@hannah,这是正确的。编辑了一下我的答案我开始更好地理解这一点,但你说的“重新绑定它的名称”是什么意思?你的意思是如果x是某个函数(x)的一个参数,而我是说在函数x=x+2中?这将导致新的内存分配,对吗?