python中的引用传参
python语言的参数传递是引用传递,即被调用函数中修改了形式参数值,调用函数的实际参数值也被改变。函数调用时,调用函数把实参变量的“地址”传给形参,整个执行期间实参和形参共用同一地址的存储单元,实参和形参其实就是一个,被调函数对形参的任何操作都等同于对实参的操作,因此实参值会随着被调用函数的形参值的改变而改变。
python中:对于不可变类型:因变量不能修改,所以运算不会影响到变量自身;
对于可变类型:函数体内的运算有可能会更改传入的实参值
引用传参一:
a = 100 # 这里的a是不可变类型 def test(a): a += a # 这个式子有两层含义:1.这里可能是重新定义一个新的变量a,2.也有可能是修改a的值 # 但由于全局变量a不能修改,所以此处是重新了一个a print("函数内:", a, id(a)) test(a) print("函数外:", a, id(a))
函数内: 200 1572488560
函数外: 100 1572486960
引用传参二:
a = [100] # 这里的a是一个列表,是可变类型 def test(a): a += a # 由于a是可变类型,所以这里是修改a print("函数内:", a, id(a)) test(a) print("函数外:", a, id(a))
函数内: [100, 100] 20268456
函数外: [100, 100] 20268456
引用传参三:
a = 100 # 这里的a是不可变类型 def test(a): a = a + a # 最初为了好理解,所以可以认为a+=a等价于a=a+a,所以这里同引用传参一 print("函数内:", a) test(a) print("函数外:", a)
函数内: 200
函数外: 100
引用传参四:
a = [100] # 这里的a是一个列表,是可变类型 def test(a): a = a + a #对于这种情况,等号左边的a是重新定义的一个量,此时a=a+a与a+=a不一样 # 1.先算=右边的 # 2.算出来的结果是[100100] # 3.a=[100,100] # 4.让a变量指向了[100,100],即a保存的是【100,100】的引用(内存地址) print("函数内:", a) test(a) print("函数外:", a)
函数内: [100, 100]
函数外: [100]