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

Python函数的参数传递及作用域

发布时间:2023-07-22 15:19:02

在Python中,参数传递是通过值传递的方式进行的。简单来说,就是将参数的值复制一份给函数,函数对这个值的操作不会影响到原来的值。为了更好地理解参数传递的方式,我们首先来看一些例子。

def change_value(value):
    value = 100

number = 10
change_value(number)
print(number)  # 输出10

在这个例子中,我们定义了一个函数change_value,它的参数是value。在函数内部,我们将value的值改变为100。然后我们定义了一个变量number,它的值是10。接下来,我们调用change_value函数,并将number作为参数传递进去。最后,我们打印出number的值,发现它并没有被改变,仍然是10。

这是因为在传递参数时,实际上是将number的值复制一份给了value,而不是将number本身传递给了函数。因此,对value的修改不会影响到number

除了值传递外,Python还支持引用传递。当参数是可变类型(比如列表、字典)时,传递的是参数的引用,函数对这个引用的操作会影响到原来的参数。

def change_list(lst):
    lst.append(100)

my_list = [1, 2, 3]
change_list(my_list)
print(my_list)  # 输出[1, 2, 3, 100]

在这个例子中,我们定义了一个函数change_list,它的参数是lst。在函数内部,我们将一个值为100的元素添加到了lst中。然后我们定义了一个列表my_list,它的元素为1、2和3。接下来,我们调用change_list函数,并将my_list作为参数传递进去。最后,我们打印出my_list的值,发现它被改变了,多了一个元素100。

这是因为在传递参数时,实际上是将my_list的引用复制一份给了lst。这两个引用指向同一个列表对象,因此对lst的修改会影响到my_list

在Python中,有时候我们希望在函数内部能够修改传递进来的不可变类型的参数。为了实现这个目的,我们可以使用可变类型的参数作为容器,传递的参数是不可变类型的引用。

def change_value(container):
    container[0] = 100

my_tuple = (1, 2, 3)
my_list = list(my_tuple)
change_value(my_list)
print(my_list)  # 输出[100, 2, 3]

在这个例子中,我们定义了一个函数change_value,它的参数是container。在函数内部,我们修改了container的 个元素为100。然后我们定义了一个元组my_tuple,它的元素为1、2和3。接下来,我们将my_tuple转换为列表my_list。然后,我们调用change_value函数,并将my_list作为参数传递进去。最后,我们打印出my_list的值,发现它被改变了, 个元素变成了100。

在函数内部,我们修改了container的 个元素,实际上是修改了my_list的 个元素。这是因为my_listcontainer指向同一个列表对象。

在Python中,变量有作用域的概念。作用域指的是变量的可见范围,变量只能在其作用域内被访问。在Python中,函数内部可以访问外部的变量,在函数外部无法访问函数内部的变量。

def print_number():
    number = 10
    print(number)

print_number()  # 输出10
print(number)  # NameError: name 'number' is not defined

在这个例子中,我们定义了一个函数print_number。在函数内部,我们定义了一个变量number,它的值是10。然后,我们通过调用print_number函数打印出了number的值。接下来,我们尝试打印外部的变量number,发现它无法访问。

这是因为number的作用域仅限于函数内部,在函数外部无法访问。如果要在函数内部访问外部的变量,我们可以使用global关键字。

def print_number():
    global number
    number = 10
    print(number)

print_number()  # 输出10
print(number)  # 输出10

在这个例子中,我们使用global关键字在函数内部声明了一个全局变量number。这样,我们可以在函数内部访问并修改外部的变量number。最后,我们通过调用print_number函数打印出了number的值,并在函数外部打印出了number的值。