Python 函数参数传递指针

Python 函数参数传递指针

Python 函数参数传递指针

在Python中,函数参数传递是按值传递的,也就是说函数接收的是参数的拷贝而非参数本身。但是对于可变对象(如列表、字典)来说,传递的是对象的指针,因此在函数内部对这些可变对象所做的修改会影响到原始对象。本文将详细介绍Python函数参数传递的原理及相关示例。

传递不可变对象

先来看一个简单的示例,传递一个整数参数:

def change_number(num):
    num = 10

x = 5
change_number(x)
print(x)
Python

运行结果为:

5
Python

在上述示例中,函数change_number中修改了num的值,但是对原始的x没有影响。这是因为在Python中整数属于不可变对象,函数传递进来的是5的拷贝而不是x本身。

传递可变对象

接下来看一个传递列表参数的示例:

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

my_list = [1, 2, 3]
change_list(my_list)
print(my_list)
Python

运行结果为:

[1, 2, 3, 4]
Python

在上述示例中,函数change_list对传入的列表my_list进行了修改,由于列表是可变对象,所以修改会直接影响到原始的列表。

传递不可变对象的可变属性

在Python中,虽然不可变对象本身无法被修改,但是如果对象具有可变属性,那么这些可变属性是可以被修改的。比如元组中的列表:

def change_tuple(tpl):
    tpl[0].append(4)

my_tuple = ([1, 2, 3],)
change_tuple(my_tuple)
print(my_tuple)
Python

运行结果为:

([1, 2, 3, 4],)
Python

虽然元组是不可变对象,但是元组中的可变列表是可以被修改的,因此对可变属性的修改是会影响到原始对象的。

传递可变对象的拷贝

如果想要在函数内部修改可变对象而不影响到原始对象,可以传递对象的拷贝。以下是一个示例代码:

def change_list_copy(lst):
    lst = lst[:]
    lst.append(4)

my_list = [1, 2, 3]
change_list_copy(my_list)
print(my_list)
Python

运行结果为:

[1, 2, 3]
Python

在上述示例中,传递了列表的拷贝给函数change_list_copy,因此函数对拷贝的修改不会影响到原始对象。

全局变量与函数内变量

在Python中,全局变量与局部变量是独立的,函数内修改变量不会影响到全局变量。但是如果全局变量是可变对象,函数内对该对象的修改会影响到全局变量的值。以下是一个示例代码:

global_var = [1, 2, 3]

def change_global():
    global global_var
    global_var.append(4)

change_global()
print(global_var)
Python

运行结果为:

[1, 2, 3, 4]
Python

在上述示例中,对全局变量global_var进行了修改,由于全局变量是可变对象,因此修改会影响到全局变量的值。

总结

在Python中,函数参数传递是按值传递的,对不可变对象的修改不会影响到原始对象,而对可变对象的修改会影响到原始对象。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册