目录
1、参数传递的本质
函数参数传递本质上是参实到形参的赋值操作。由于Python一切皆对象,所以python中的赋值传递都是“引用传递”,而不是“值传递”。
2、参数的分类
具体操作可以分两类:可变对象和不可变对象。
可变对象:对可变对象写操作,直接作用在对象本身。
不可变对象:对不可变对象写操作,会产生新的“对象空间”来写操作,达到值传递的效果,但不是真正的值传递。
可变对象:列表,字典,集合,自定义对象等
不可变对象:数字、字符串、元组,函数等
3、代码演示及分析
3.1 传递可变对象
# 传可变对象
def test01(m):
print("m的地址:", id(m)) # 变量m和可变对象同地址
m.append(30)
print("m的值:", m) # [10, 20, 30]
if __name__ == "__main__":
print("**************传递参数为可变对象**************")
a = [10, 20] # 可变对象列表
print("a的地址:", id(a))
print("a的值:", a)
print("**************")
test01(a) # 向函数传可变对象
print("a的地址:", id(a))
print("a的值:", a) # a的值: [10, 20, 30]
**************传递参数为可变对象**************
a的地址: 1819302753216
a的值: [10, 20]
**************
m的地址: 1819302753216
m的值: [10, 20, 30]
a的地址: 1819302753216
a的值: [10, 20, 30]
在函数内对m做添加数据操作,a的内容也发生了改变。说明当传递可变对象时,写操作就是作用在对象本身。同时观看变量a和m的地址也可以看出二者都指向同一块内容。
3.2 传递不可变对象
# 传不可变对象
def test02(m):
print("m的地址:", id(m)) # 变量m和不可变对象同地址
print("m的值:", m)
m = m + 30 # 不可变对象无法进行修改操作,因此会生成新的对象m来操作。
print("m的地址:", id(m)) # 此处变量m的地址已经改变
print("m的值:", m)
if __name__=="__main__"
print("**************传递参数为不可变对象**************")
n = 100 # 不可变对象数字
print("n的地址:", id(n))
print("n的值:", n)
print("**************")
test02(n) # 向函数传不可变对象
print("n的地址:", id(n))
print("n的值:", n) # n = 100
**************传递参数为不可变对象**************
n的地址: 140722447790992
n的值: 100
**************
m的地址: 140722447790992
m的值: 100
m的地址: 140722447791952
m的值: 130
n的地址: 140722447790992
n的值: 100
在函数内对m做修改操作,a的内容并没有发生改变。说明当传递不可变对象时,写操作没有作用在对象本身,而是在函数内部新开辟了空间。通过m的地址可发现在操作 m=m+30 指令前后m的地址已经改变。
3.3 传递不可变对象包含可变对象
# 不可变对象元组含列表
def test03(m):
print("m:", id(m)) # 变量m和不可变对象同地址
m[2][0] = 888
print(“m的值:”,m)
print("m的地址:", id(m))
if __name__ == "__main__":
print("**************传递参数为不可变对象(内部含可变对象)**************")
a = (10, 20, [5, 6]) # 不可变对象元组含列表
print("a的地址:", id(a))
print("a的值:", a)
print("**************")
test03(a) # 向函数传不可变对象
print("a的地址:", id(a))
print("a的值:", a)
**************传递参数为不可变对象(内部含可变对象)**************
a的地址: 1970610918784
a的值: (10, 20, [5, 6])
**************
m的地址: 1970610918784
m的值: (10, 20, [888, 6])
m的地址: 1970610918784
a的地址: 1970610918784
a的值: (10, 20, [888, 6])
在函数内对m做修改操作,a的内容发生改变。说明当传递不可变对象(包含可变对象)时,写操作作用在对象本身。
总结:当参数有可变对象时,就作用在可变对象本身。没有可变对象时,则会开辟新空间。
个人总结,不对之处欢迎指出