Python 何时传的是值,何时传的是引用?

在 Python 中,参数的传递方式可以是传值(pass by value)或传引用(pass by reference)。然而,实际上 Python 中的参数传递方式是通过对象的引用进行传递。简单来说,当传递不可变对象时(如数字、字符串、元组等),Python 采用的是传值的方式,即创建了对象的副本,并将副本传递给函数或赋值给其他变量。这意味着在函数内部修改参数的值不会影响到原始对象。然而,当传递可变对象时(如列表、字典、集合等),Python 采用的是传引用的方式,即传递的是对象的引用(内存地址),而不是对象的副本。这意味着在函数内部对参数对象的修改会影响到原始对象。

def modify_value(num):
    num = 10  # 修改了参数的值
    print(num)

x = 5
modify_value(x)  # 输出 10
print(x)  # 输出 5,原始对象未受影响



def modify_list(lst):
    lst.append(4)  # 修改了参数对象
    print(lst)

my_list = [1, 2, 3]
modify_list(my_list)  # 输出 [1, 2, 3, 4]
print(my_list)  # 输出 [1, 2, 3, 4],原始对象被修改

需要注意的是,虽然 Python 中的参数传递方式是通过对象引用进行的,但实际上并不涉及指针的操作。因此,我们可以将参数传递方式描述为"按对象引用传递",而不是传统意义上的"按引用传递"。

此外,对于不可变对象,例如元组,尽管不能直接修改其值,但可以通过重新赋值变量来改变引用的对象。这样的操作会生成一个新的对象,并将变量重新指向新的对象。

def modify_tuple(tpl):
    tpl = (4, 5, 6)  # 重新赋值变量,生成新的元组对象
    print(tpl)

my_tuple = (1, 2, 3)
modify_tuple(my_tuple)  # 输出 (4, 5, 6)
print(my_tuple)  # 输出 (1, 2, 3),原始对象未受影响

总结而言,Python 的参数传递方式是通过对象引用进行的,对于不可变对象是传值的方式,对于可变对象是传引用的方式。

你可能感兴趣的:(Python精修,python,传值,传引用,可变对象,不可变对象)