python中的参数传递

我们知道C语言中只有值传递(地址也是值),C++中额外有引用传递,那么在python中的参数是如何传递的呢,要理解这一点,我们就需要知道python传递的到底是什么,在C/C++中有变量的概念,但是在python中是没有这个概念的,在python的世界中,万物皆对象,我们可以通过名字来操控这些对象,先来解释以下这种思想:

>>>a = 1
>>>b = 1
>>>print(id(a))
1526188160
>>>print(id(b))
1526188160

>>> a = 'xxx'
>>> b = 'xxx'
>>> print(id(a))
66453024
>>> print(id(b))
66453024

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> print(id(a))
66536472
>>> print(id(b))
66552376

>>> a = (1, 2, 3)
>>> b = (1, 2, 3)
>>> print(id(b))
66372792
>>> print(id(a))
66372712

>>> a = {"a":1}
>>> b = {"a":1}
>>> print(id(a))
66565824
>>> print(id(b))
66570592

>>> b = (1, 2, 3)
>>> a = b
>>> print(id(a))
66372712
>>> print(id(b))
66372712

通过上面的测试,我们发现对于数值和字符串常量,只要值是相同的,那么它们的名字的id就是相同的,但是对于列表,元组,字典等即使它们值是一样,它们的id也是不同的,但如果是通过赋值操作,它们的id便是相同的,通过上面我们得出阶段性结论:在Python中,万物皆对象,通过名字操作对象,一个对象可以被多个名字关联,一个名字只能关联一个对象。

有了上面的理解,我们应该已经大概知道python中的参数传递是怎么回事了,下面来具体解释看一下

def function(args):
    print(id(args))

a = []
function(a)
print(id(a))
PS C:\Users\jiage\Desktop\python\venv> python .\test.py
18892240
18892240

我们传递一个列表名字给函数,我们可以看到函数内部的名字args和外部的名字a指向同一个列表,下面我们试图在函数内部改变这个列表内容。

def function(args):
    a.append(2)

a = []
function(a)
print(a)

下面是执行结果

PS C:\Users\jiage\Desktop\python\venv> python .\test.py
[2]

可以看到,函数内部的操作影响到了外部的列表a,这说明,利用任何对象的任何一个标签都可以改变对象的值(首先这个对象得是可变对象),上面的一切都符合我们的预期,但是下面有点不一样。


下面我们传递一个数值对象进去看看

def function(args):
    print(id(args))

a = 0
function(a)
print(id(a))
PS C:\Users\jiage\Desktop\python\venv> python .\test.py
1526188144
1526188144

仿佛也没什么问题,内部的名字args还是与a指向同一个对象,接着看

def function(args):
    args = 1
    print(id(args))

a = 0
function(a)
print(id(a))
print(a)
PS C:\Users\jiage\Desktop\python\venv> python .\test.py
1526188160
1526188144
0

我们发现,当给args赋值后,args就与a指向的对象不同了,按照我们前面的设想,这时候它们应该还是一样的,而且a的值应该变成1,但这时候a却没有变,这是怎么回事呢?经过调查,我发现,语言在设计之初就不希望常量对象被改变,所以我们是无法通过标签来改变一个内存中的数值的,我们只能把这个标签贴到另一个常量对象上,这与C/C++是不同的,C/C++是实实在在地通过指针改变了对应存储单元的内容。说到这里,上面的现象也就不难理解了,当我们把a赋值给args后,如果我们没有给args赋值,那么我们可以照常引用a的值,但是一旦我们给args重新赋值之后,args就相当于从a指向的对象上撕了下来贴到了另一个新的对象上,所以它之后就和a完全没有关系了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值