欢迎访问宙启技术站
智能推送

了解Python函数的参数传递方式及常见问题

发布时间:2023-12-10 18:03:21

Python的函数参数可以按照传递方式分为两种:值传递和引用传递。下面会详细介绍这两种传递方式及相关常见问题。

1. 值传递(传递的是变量的副本):

值传递是指函数调用时,会把实际参数的值复制一份给形式参数,此后形式参数和实际参数是完全独立的,彼此之间的修改互不影响。在Python中,如下几种情况下使用的是值传递方式:

- 不可变对象作为参数:例如数字、字符串和元组等。

- 可变对象通过值传递方式传递:例如列表是可变对象,但在函数调用时仍然是值传递。

值传递的常见问题:

(1) 修改不可变对象的值不会影响原对象的值:

       def change_value(num):
           num = 10
       a = 5
       change_value(a)
       print(a)  # 输出结果为5
       

(2) 传递可变对象,修改对象的值会影响原对象:

       def change_list(lst):
           lst.append(4)
       b = [1, 2, 3]
       change_list(b)
       print(b)  # 输出结果为[1, 2, 3, 4]
       

2. 引用传递(传递的是变量的地址):

引用传递是指函数调用时,会将实际参数的引用传入函数,形参与实参指向同一个对象,在函数内部对形参的修改会影响到实参。在Python中,如下几种情况下使用的是引用传递方式:

- 可变对象作为参数:例如列表、字典和集合等。

- 对象的引用传递:例如函数传递对象。

引用传递的常见问题:

(1) 修改可变对象的值会影响原对象:

       def change_list(lst):
           lst.append(4)
       b = [1, 2, 3]
       change_list(b)
       print(b)  # 输出结果为[1, 2, 3, 4]
       

(2) 对象的引用传递:

       def change_name(person):
           person['name'] = 'Alice'
       p = {'name': 'Bob'}
       change_name(p)
       print(p)  # 输出结果为{'name': 'Alice'}
       

总结:

- 值传递是传递对象的副本,不影响原始对象,而引用传递是传递对象的引用,对对象的修改会影响到原始对象。

- 不可变对象在函数调用时使用值传递,修改不可变对象的值不会影响原对象。

- 可变对象在函数调用时使用引用传递,修改可变对象的值会影响原对象。

- 对象的引用传递可以理解为传递对象的地址,函数内部对形参的修改会影响到实参。

因此,在使用Python函数时,需要注意参数传递方式及对不可变和可变对象的理解,以避免产生不符合预期的结果。