Python 中的函数参数传递有两种方式:按值传递(pass by value)和按引用传递(pass by reference)。在讨论函数参数值改变的问题之前,我们首先需要了解一下这两种传递方式的区别。

在按值传递中,函数接收的是参数的副本,对参数的任何修改都不会影响原始值。而在按引用传递中,函数接收的是参数的引用,对参数的修改将直接影响原始值。

下面我们通过一些代码示例来说明这两种传递方式的区别。

首先,我们定义一个简单的函数 change_value,该函数用于修改传入的参数的值:

def change_value(x):
    x = 2

然后,我们定义一个变量 a,并调用 change_value 函数来修改 a 的值:

a = 1
change_value(a)
print(a)  # 输出:1

在这个例子中,我们期望 a 的值被修改为 2,但实际上输出的结果是 1。这是因为在 Python 中,函数参数的传递是按值传递的,即 change_value 函数接收的是 a 的副本。因此,对 x 的修改不会影响到 a 的值。

接下来,我们将函数 change_value 修改为按引用传递的方式:

def change_value(lst):
    lst[0] = 2

然后,我们定义一个列表 lst,并调用 change_value 函数来修改列表中的第一个元素的值:

lst = [1, 2, 3]
change_value(lst)
print(lst)  # 输出:[2, 2, 3]

在这个例子中,函数 change_value 接收的是 lst 的引用,因此对 lst[0] 的修改会直接影响到原始列表 lst

需要注意的是,Python 中的不可变对象(如数字、字符串、元组等)是按值传递的,而可变对象(如列表、字典等)是按引用传递的。

下面我们通过一个类的例子来进一步说明函数参数值改变的问题。

假设我们有一个名为 Person 的类,该类有一个实例变量 name

class Person:
    def __init__(self, name):
        self.name = name

然后,我们定义一个函数 change_name,该函数用于修改 Person 对象的 name 值:

def change_name(person):
    person.name = 'Alice'

接下来,我们创建一个 Person 对象 p,并调用 change_name 函数来修改 pname 值:

p = Person('Bob')
change_name(p)
print(p.name)  # 输出:Alice

在这个例子中,我们可以看到函数 change_name 修改了 p 对象的 name 值,并且这个修改是直接作用于原始对象上的。

综上所述,Python 中的函数参数传递方式取决于参数的类型。对于不可变对象,函数参数是按值传递的,对参数的修改不会影响原始值;而对于可变对象,函数参数是按引用传递的,对参数的修改将直接影响原始值。

类图如下:

classDiagram
    class Person{
        - name: str
    }
    Person : +__init__(name: str)

状态图如下:

stateDiagram
    [*] --> Person
    Person --> [*]

通过以上内容,我们对 Python 中函数参数值改变的问题有了一定的了解。在实际编程中,我们需要根据参数的类型来选择合适的传递方式,以确保函数的行为符合预期。