关于 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 或者 常量。
推荐文章: