如果没有指针,我可以将引用作为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”开始是对原始列表的引用,但是我们改变该名称以指向新的不同列表。
Python参数始终是“引用”。
Python中的参数工作方式以及它们在文档中的解释方式可能会让新手对这些语言产生混淆和误导,特别是如果您有其他语言的背景,可以让您在“按值传递”和“通过参考”。
用Python术语来说,“引用”只是一个指针,其中包含更多元数据以帮助垃圾收集器完成其工作。 而且每个变量和每个参数都是“引用”。
因此,在内部,Python将“指针”传递给每个参数。 在这个例子中你可以很容易看到:
>>> def f(L):
... L.append(3)
...
>>> X = []
>>> f(X)
>>> X
[3]
变量X指向一个列表,参数L是列表“指针”的副本,而不是列表本身的副本。
请注意,这与“带引用的传递”不同,C ++带有&
限定符,或带有var
限定符的pascal。
上一篇: Without pointers, can I pass references as arguments in Python?