python函数是值传递仍是引证传递ITeye - 威尼斯人

python函数是值传递仍是引证传递ITeye

2019-01-11 19:31:10 | 作者: 尔容 | 标签: 引证,函数,传递 | 浏览: 2391

 

       一切参数(自变量)在Python里都是按引证传递。假设你在函数里修正了参数,那么在调用这个函数的函数里,原始的参数也被改动了。

 

def changeme( mylist ):
 "修正传入的列表"
 mylist.append([1,2,3,4]);
 print "函数内取值: ", mylist
 return
list1 = [10,20,30];
changeme( list1 );
print "函数外取值: ",list1

 

 运转成果:

 

函数内取值: [10, 20, 30, [1, 2, 3, 4]]
函数外取值: [10, 20, 30, [1, 2, 3, 4]]
[Finished in 0.2s]

 

 

 

感觉如同真的是引证传递,于是乎自己写了点代码验证:

def changeA(a):
 a = 10
num = 2
changeA(num)
print num

 

打印出的成果却是 “2”。。。。蒙圈了!。。。说好的引证传递呢。

 

 

 

 

网上查找了一番,发现很多人是这么说的:

 

    不行变类型引证传递,可变类型值传递。

原来是这样,但啥是可变类型,不行变类型,又在网上查找了一下:

    在python中,strings, tuples, 和numbers是不行更改的目标,而list,dict等则是能够修正的目标

 

这样如同能够解说上面的代码了,可是个人觉得传目标引证(目标传递)更好了解

 

在python中,变量便是一个变量,没有类型可言,咱们能够给一个变量赋各种类型的值

a=2
a="test"
a=[2,3,3]

而类型是归于目标,一个类型详细的值在内存中都一个地址,改动变量的值其实是改动了它引证的地址

print id(1)
print id(2)
print id(a)
print id(a)
print id(c)

运转成果:

23044824
23044812
23044824
23044812
23044812
[Finished in 0.1s]

  

上面代码能够看出,整型1,2在内存中有自己的地址,把他们赋值给变量的时分,便是把自己的地址引证给了变量。

 

现在来解说上面的代码:

    列表[10,20,30]是一个目标,有自己的内存地址,比方是:123456,变量list1用这个地址指向了这个列表。调用函数changeme的时分,这个列表目标的地址传给了mylist,此刻list1和mylist都指向了同一个列表

。mylist调用append办法,由于列表是可变类型(个人了解为能够改动值,但地址不变),地址123456的列表变为[10, 20, 30, [1, 2, 3, 4]],  所以list1的值也是[10, 20, 30, [1, 2, 3, 4]]。

 

     第二段代码,num=2, 2也是一个目标,假设2在内存的地址是:54321,此刻变量num的地址是:54321。调用函数changeA,此刻变量a的地址也是54321,此刻a=2,接着a=10,由于数字类型是不行变类型,2不能直接变为10,10在内存中是别的一个地址,比方54330。上面说过改动变量的值其实是改动引证的地址,因而当a=10履行完后,变量a的地址是54300,而num的地址依然是54321,其值也便是2

 

 

 

再附上个链接参阅一下:

http://www.cnblogs.com/bovine/archive/2011/11/26/2264390.html

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表威尼斯人立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章