参考网址:
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在内存中的地址是唯一的,不管将它指向多少个对象。
网友评论