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]

 

posted @ 2018-11-23 20:29  wind_y  阅读(2199)  评论(0编辑  收藏  举报