Python在函数内改变实参的值

在Python中,函数参数的传递方式是“传对象引用”,也就是说,函数接收的是参数对象的引用,而不是参数对象的值。这就意味着,在函数内部对参数的修改,可能会影响原始对象。本文将通过代码示例和类图、序列图来解释这一概念。

代码示例

假设我们有一个简单的类Person,它有两个属性:nameage

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

    def __repr__(self):
        return f"Person(name={self.name}, age={self.age})"

现在我们定义一个函数increase_age,它接收一个Person对象,并将其年龄增加1。

def increase_age(person):
    person.age += 1

我们创建一个Person对象,并调用increase_age函数。

p = Person("Alice", 30)
print("Before:", p)

increase_age(p)
print("After:", p)

输出结果如下:

Before: Person(name=Alice, age=30)
After: Person(name=Alice, age=31)

可以看到,虽然我们在函数内部修改了person.age,但原始对象page属性也被改变了。

类图

以下是Person类的类图:

classDiagram
    class Person {
        +name : str
        +age : int
        __init__(name : str, age : int)
        __repr__() : str
    }

序列图

以下是调用increase_age函数的序列图:

sequenceDiagram
    participant Alice as Person(name="Alice", age=30)
    participant increase_age

    Alice->>increase_age: increase_age(p)
    increase_age->>Alice: age += 1
    Alice->>Alice: age = 31

结论

在Python中,函数参数的传递方式是“传对象引用”,这意味着函数内部对参数的修改可能会影响原始对象。因此,在使用函数时,我们需要特别注意这一点,以避免意外的副作用。同时,这也为我们提供了一种灵活的方式来操作和修改对象。通过理解这一机制,我们可以更好地利用Python的函数和对象,编写出更加高效和优雅的代码。