python函数值传递还是引用传递

c/c++中有值传递引用传递的区别。但是python中是值传递还是引用传递呢?首先看python中对变量的定义

“python中变量是指向某个内存的, 而内存中的内容是不可变的。”

python的函数调用中,传递的是变量所指向的地址,但仍然很难说它是按照引用还是按照值传递。 比如:

>>> a=1  # 定义变量 a=1
>>> def f(v):  # 定义函数,接受参数并改变其值为2
...     v=2
...     return v
... 
>>> id(a)  # a的地址是10243176
10243176
>>> f(a)  # 用f调用a
2
>>> id(a)  # a的地址仍然是10243176
10243176
    >>> a  # a的值仍然也是1
    1

这里虽然传递进 f的是a指向的内存地址, 但由于指向的地址不可变,所以在v=2的时候,其实是新创建了一个变量,并且把其指向2. 因此调用完成后,看起来像是按值传递

再比如

>>> l = [1,2,3,]
>>> f = lambda x:x.append(4)
>>> id(l)
140526430340592
>>> f(l)
>>> id(l)
140526430340592
>>> l
[1, 2, 3, 4]

这里, 传递的l 在经过f调用后 其值发生了变化,但可以看到它指向的地址仍然没变。 这看起来又像是按引用传递。

所以,python中很难说是按照引用传递还是按照值传递,因为python中变量指向的对象有时候是可变的,有时候是不可变的。 所以如果对象是可变的,如列表,字典则是按照引用传递,如果对象是不可变的如tuple则是按照值传递

posted on 2016-11-11 13:47  kramer  阅读(387)  评论(0编辑  收藏  举报

导航