关于 Python函数参数的一些小细节
好久以前学python时候,前辈给举得例子。今天教新人时候突然想不起来了,记录一下。
def append_0(a):
a.append(1)
return a
def append_1(a):
b = a
b.append(1)
return b
def append_2(a):
c = a[:]
c.append(1)
return c
def append_3(a = []):
a.append(1)
return a
test_0 = [1, 2, 3, 4]
value_0 = append_0(test_0)
print(test_0, value_0)
test_1 = [1, 2, 3, 4]
value_1 = append_1(test_1)
print(test_1, value_1)
test_2 = [1, 2, 3, 4]
value_2 = append_2(test_2)
print(test_2, value_2)
test_3 = [1, 2, 3, 4]
value_3 = append_3(test_3)
append_3()
value_4 = append_3()
print(test_3, value_3, value_4)
[1, 2, 3, 4, 1] [1, 2, 3, 4, 1]
[1, 2, 3, 4, 1] [1, 2, 3, 4, 1]
[1, 2, 3, 4] [1, 2, 3, 4, 1]
[1, 2, 3, 4, 1] [1] [1, 1]
输出的结果还是挺有意思的。
主要不好理解的是第一个和第四个,这两个的表现会和其他语言表现的会有不同。是因为 python
所有的函数参数传递都是引用传递而不是值传递,调用函数时传入的不是变量的值而是变量的引用。所以修改函数参数会修改所指向的内存地址的值, 也就是传入的那个变量的值, 而不仅仅是修改函数参数的值。同样函数的默认参数也不是一个值, 而是一个引用, 所以这个默认参数也能被修改。
知道了以上知识, 在写python的时候就需要注意:
- 在函数的方法体中不要轻易修改函数的传入参数。
- 尽量把函数的默认参数设置为不能修改的值, 如 None 或者 常量。
纯小白,没做过语法题,请问这是要我们回答什么?是要我们回答
test_3
,value_3
,value_4
的值吗?在 Python 中,函数参数传递的机制是 传对象的引用(Passing Object References)。具体来说,当函数的参数为可变对象(如列表、字典等)时,如果在函数内对这个对象进行修改,函数外部也会受到影响。而当函数的参数为不可变对象(如整数、字符串等)时,如果在函数内对这个对象进行修改,函数外部不会受到影响,因为 Python 中的不可变对象是无法修改的。