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

Python函数的参数传递方式及参数类型详解

发布时间:2023-07-06 03:36:45

Python中函数的参数传递方式有以下几种:传值调用(Call by Value)、传引用调用(Call by Reference)、传址调用(Call by Sharing)。下面将对这三种参数传递方式进行详细解释,并讨论函数参数的类型问题。

1. 传值调用(Call by Value)是指将实际参数值的副本传递给函数的形式参数,即在函数内部修改形式参数的值不会对实际参数产生影响。在Python中,不可变类型的参数(如整数、字符串、元组)是通过传值调用传递的。

例如:

def change_value(x):

    x = x + 1

    print('内部x的值为:', x)

y = 5

change_value(y)

print('外部y的值为:', y)

运行结果为:

内部x的值为: 6

外部y的值为: 5

可见,函数内部修改了形式参数x的值,但是外部的实际参数y的值并未受到影响。

2. 传引用调用(Call by Reference)是指将实际参数的引用传递给函数的形式参数,即在函数内部修改形式参数的值会对实际参数产生影响。在Python中,可变类型的参数(如列表、字典、集合)是通过传引用调用传递的。

例如:

def change_list(lst):

    lst.append(4)

    print('内部lst的值为:', lst)

my_list = [1, 2, 3]

change_list(my_list)

print('外部my_list的值为:', my_list)

运行结果为:

内部lst的值为: [1, 2, 3, 4]

外部my_list的值为: [1, 2, 3, 4]

可以看到,函数内部通过append()方法往形式参数lst中添加了元素4,并且外部的实际参数my_list的值也发生了变化。

3. 传址调用(Call by Sharing)是指将实际参数的地址传递给函数的形式参数,即函数内部对形式参数的修改可能会影响到实际参数,但是如果形式参数重新绑定了新的对象,则不会对实际参数产生影响。在Python中,其他一些可变类型的参数(如numpy数组)也是通过传址调用传递的。

例如:

import numpy as np

def change_array(arr):

    arr[0] = 100

    print('内部arr的值为:', arr)

my_arr = np.array([1, 2, 3])

change_array(my_arr)

print('外部my_arr的值为:', my_arr)

运行结果为:

内部arr的值为: [100 2 3]

外部my_arr的值为: [100 2 3]

可以看到,函数内部将形式参数arr的 个元素修改为100,并且外部的实际参数my_arr的 个元素也发生了变化。

对于函数参数的类型问题,Python是一门动态类型语言,不需要在函数定义时指定参数的类型,也不会对函数参数的类型进行静态检查。这意味着可以在函数调用时传递任意类型的参数。

例如:

def add_func(a, b):

    return a + b

print(add_func(1, 2))

print(add_func('hello', 'world'))

print(add_func([1, 2, 3], [4, 5, 6]))

运行结果为:

3

helloworld

[1, 2, 3, 4, 5, 6]

可以看到,add_func()函数接受不同类型的参数,并能够正确地进行相应的操作。

总的来说,Python中函数的参数传递方式有传值调用、传引用调用和传址调用。对于函数参数的类型,Python是一门动态类型语言,不需要指定参数的类型,并且可以接受不同类型的参数。