关于 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]

输出的结果还是挺有意思的。 :smile:
主要不好理解的是第一个和第四个,这两个的表现会和其他语言表现的会有不同。是因为 python 所有的函数参数传递都是引用传递而不是值传递,调用函数时传入的不是变量的值而是变量的引用。所以修改函数参数会修改所指向的内存地址的值, 也就是传入的那个变量的值, 而不仅仅是修改函数参数的值。同样函数的默认参数也不是一个值, 而是一个引用, 所以这个默认参数也能被修改。

知道了以上知识, 在写python的时候就需要注意:

  1. 在函数的方法体中不要轻易修改函数的传入参数。
  2. 尽量把函数的默认参数设置为不能修改的值, 如 None 或者 常量。
讨论数量: 5

纯小白,没做过语法题,请问这是要我们回答什么?是要我们回答test_3, value_3, value_4的值吗?

10个月前 评论
徵羽宫 (楼主) 10个月前
Echo_AFang 10个月前
pardon110

在 Python 中,函数参数传递的机制是 传对象的引用(Passing Object References)。具体来说,当函数的参数为可变对象(如列表、字典等)时,如果在函数内对这个对象进行修改,函数外部也会受到影响。而当函数的参数为不可变对象(如整数、字符串等)时,如果在函数内对这个对象进行修改,函数外部不会受到影响,因为 Python 中的不可变对象是无法修改的。

10个月前 评论
徵羽宫 (楼主) 10个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!