Python到底值传值还是传引用?
先看两段代码
代码1:
1
2
3
4
5
6
7
|
>>> a
=
3
>>>
def
f(b):
... b
=
1
...
>>> f(a)
>>> a
3
|
1
2
3
4
5
6
7
8
|
>>> a
=
[
1
,
2
]
>>>
def
f(b):
... b[
0
]
=
'a'
>>> a
[
1
,
2
]
>>> f(a)
>>> a
[
'a'
,
2
]
|
代码是网上抄来的,但是结果基本上是可信的。
于是可能会有人觉得Python是基本类型传值,而复杂类型是传引用。更有人甚至说全都是传引用balabala...
我的理解是,Python全部都是传值的,只是Python里面没有值,只有引用,所有的变量都是引用。
以C++的观点,可以认为Python里面函数都是传值的,而Python里面的所有值都是指针。Python统一管理所有的值。
比如说定义a=3,b=3,那么a和b其实都是引用,真正的值3在内存中只有一个空间。
以第一段代码为例:指针a指向了保存3这个字面值的那个空间,然后这个指针被以传值的方式传递给函数f,
由于是传值的方式传递函数的,所以a本身不会被传进来,而只是造了一个跟a值一样的指针,传入f。
在f中,这个临时造出来的指针被指向了一个新的空间,这个空间的字面值为1,当然没有对原来的指针a产生任何影响
再来说说第二段代码:指针a指向了一个数组的起始地址。然后这个起始地址被以值传递的方式传入函数f,
由于值传递产生的临时变量b和原来指针a的值是一样的,所以a[0]和b[0]指向的是同一个地址。所以修改
b[0]就等于修改了a[0]。
总的来说,python都是值传递的,而python里面所有的变量其实都是引用。
另外如果想从函数返回值,可以
def function(...):
balabala...
return (param1, param2, ...)
balabala
(param1, param2, ...) = function(...)
所有的返回值就都归为啦