严格来讲,python中并不存在值传递和引用传递的说法,准确地说,Python 的参数传递是赋值传递 (pass by assignment),或者叫作对象的引用传递(pass by object reference),使用这两个说法只是为了更好地联系已经学过的内容,方便进行类比分析。
在 Python 中:
1、变量的赋值,只是表示让变量指向了某个对象,并不表示拷贝对象给变量;而一个对象,可以被多个变量所指向。
2、可变对象(列表,字典,集合等等)的改变,会影响所有指向该对象的变量。
3、对于不可变对象(字符串、整型、元组等等),所有指向该对象的变量的值总是一样的,也不会改变。但是通过某些操作(+= 等等)更新不可变对象的值时,会返回一个新的对象。
def fun(lst, num, string):
lst += ['yes']
num += 1
string += 'abc'
lst = list('hello')
num = 100
string = 'def'
print('befor:')
print(lst, num, string)
fun(lst, num, string)
print('after:')
print(lst, num, string)
输出:
befor:
['h', 'e', 'l', 'l', 'o'] 100 def
after:
['h', 'e', 'l', 'l', 'o', 'yes'] 100 def
从中可以看到,对列表的修改是作用在原对象上的,而对数字,字符串的修改不是直接作用在原对象上的。
再看例子:
def my_func4(l2):
l2 = l2 + [666]
l1 = [1, 2, 3]
print('befor:')
print(l1)
print('after:')
my_func4(l1)
print(l1)
输出:
befor:
[1, 2, 3]
after:
[1, 2, 3]
分析:
my_func4赋值语句左边的l2是新建立的,右边的l2是传入的,因为赋值符号(=)会产生新的对象,所以这个值并不会返回
如果要拿到修改后的值,则需要使用return进行返回:
def my_func5(l2):
l2 = l2 + [4]
return l2
l1 = [1, 2, 3]
print('befor:')
print(l1)
print('after:')
l1 = my_func5(l1)
print(l1)
执行结果:
befor:
[1, 2, 3]
after:
[1, 2, 3, 4]
https://www.toutiao.com/article/6884789411372859918/?wid=1700120213662
https://blog.csdn.net/weixin_41798450/article/details/89306399