python函数值传递和引用传递

概述

  • 不可变类型:类似 c 的值传递
    如 整数、字符串、元组。如fun(a),在函数内部改变变量的值,不影响函数外部的变量

  • 可变类型:类似 c 的引用传递
    如 列表,字典。如 fun(la),在函数内部改变变量的值,函数外部的变量也跟着改变

值传递

例子

定义不可变数据类型,并传入函数中

def hello2(s2):
    print('2-',s2)
    #执行赋值操作
    s2='人生苦短,我用python'
    print('3-',s2)

s='python'
print('1-',s)
hello2(s)
print('4-',s)

执行结果:

1- python
2- python
3- 人生苦短,我用python
4- python

从结果“4-python”中可知:在函数内改变形参的值,不会改变函数外变量的值

将上面的变量指向内存地址打印出来:

def hello2(s2):
    print('2-',s2,"id:",id(s))
    s2='人生苦短,我用python'
    print('3-',s2,"id:",id(s2))

s='python'
print('1-',s,"id:",id(s))
hello2(s)
print('4-',s,"id:",id(s))

结果:

1- python id: 53123488
2- python id: 53123488
3- 人生苦短,我用python id: 53129440
4- python id: 53123488

可知:形参 指向的内存地址,与 函数外部变量 的内存地址相同,但重新 赋值 后,形参 指向另一个内存地址

引用传递

例子

定义 可变数据类型,并传入函数中:

def hello3(l):
    print('2-',l)
    l.append('java')
    print('3-',l)

l=['html','css']
print('1-',l)
hello3(l)
print('4-',l)

执行结果:

1- ['html', 'css']
2- ['html', 'css']
3- ['html', 'css', 'java']
4- ['html', 'css', 'java']

可知:形参 指向的内存地址,与 函数外部变量 的内存地址相同,所以通过 形参 改变 可变数据类型 的内容,函数外部变量 的内容也跟着改变

在函数内部重新赋值

def fun_list(l):
    print("id(l): 内1", id(l))
    #关键代码:在函数内部重新赋值
    l=[1,2,3]
    l.append("新元素")
    print("id(l): 内2", id(l))

l=[1,3.14,'python',True]
print("id(l): 外1",id(l))
fun_list(l)
print("id(l): 外2",id(l))
print(l)

行为如下图:重新赋值后,形参 l指向 新 的内存地址,所以调用append()方法时,改变的是 新 list 的内容,函数外部 的 l 并没有改变


原文出处:/show_1EF29wB54N34.html