美文网首页
关于参数传递问题

关于参数传递问题

作者: bf3780a4db09 | 来源:发表于2019-01-23 23:46 被阅读4次

参考网址:
https://www.jianshu.com/p/2c83db2f5ef3
http://www.cnblogs.com/binyue/p/3862276.html
第一种:参数是可变对象【列表】,实参传递的是参数的地址【引用传递】。未将参数指向新的对象。
结果:参数的地址一直没变,即直接对参数进行修改。
例一:修改列表

def add(number):
    print('第二处:', id(number))
    for i in range(len(number)):
        number[i] = number[i] * 10
    print('第三处:', id(number))


def test():
    number = [1000, 105, 3500, 739]
    print('第一处:', id(number))
    add(number)
    print(number)
    print('第四处:', id(number))


test()

结果


111.png

例2:增加列表元素

def addInterest(balances):
    print('第二处:', id(balances))
    # for i in range(len(balances)):
    balances.append(123)
    print('第三处:', id(balances))


def test():
    amounts = [1000, 567]
    print('第一处:', id(amounts))
    addInterest(amounts)
    print(amounts)
    print('第四处:', id(amounts))


test()

结果


111.png

第二种:参数是可变对象【列表】,实参传递的是参数的地址【引用传递】,但是函数将参数指向新的对象。
参考博文中的结果是不影响原对象的值,此处我觉得根本原因在于采用的方法,是否会改变对象本身的值。

a = [1, 2, 3]
print(a * 10)
print(a)
a.append(4)
print(a)

结果


image.png

例一:

def addInterest(balances):
    print('第二处:', id(balances))
    # for i in range(len(balances)):
    balances = balances * 10  # 此时的balances是一个新的对象
    print('第三处:', id(balances))

def test():
    amounts = [1000, 567]
    print('第一处:', id(amounts))
    addInterest(amounts)
    print(amounts)
    print('第四处:', id(amounts))  # 由于参数被指向新的对象,不影响原对象值


test()

结果:产生新地址,不影响原变量的值,balances * 10 不影响原对象的值。


111.png

例二:

def addInterest(balances):
    print('第二处:', id(balances))
    # for i in range(len(balances)):
    balances = balances.append(123)  # 此时的balances是一个新的对象
    print('第三处:', id(balances))


def test():
    amounts = [1000, 567]
    print('第一处:', id(amounts))
    addInterest(amounts)
    print(amounts)
    print('第四处:', id(amounts))  # 由于参数被指向新的对象,不影响原对象值


test()

结果:产生新地址,影响原变量的值,append直接修改已有对象。


111.png

所以,我觉得,上面两种可以总结为一种,针对可变对象,原变量是否修改与是否将变量指向一个新的对象没有直接关系,与使用的方法是否直接修改了原对象有关。
第三种:参数是不可变对象【常数】,实参传递的是参数的值【值传递,函数接收的是原始值的一个copy,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。】
结果:不影响原对象的值。

def addInterest(balances):
    print('第二处:', id(balances))
    # for i in range(len(balances)):
    balances = balances * 10  # 此时的balances是一个新的对象
    print('第三处:', id(balances))


def test():
    amounts = 1000
    print('第一处:', id(amounts))
    addInterest(amounts)
    print(amounts)
    print('第四处:', id(amounts))


test()

结果


111.png

另外,发现不可变对象的地址是共享的,如

a = 1
b = 1
c = 1
print(id(a), id(b), id(c))

结果


image.png

可见1在内存中的地址是唯一的,不管将它指向多少个对象。

相关文章

网友评论

      本文标题:关于参数传递问题

      本文链接:https://www.haomeiwen.com/subject/dnrejqtx.html