值传递,引用传递,赋值传递,一文理解python的参数传递和赋值
当你在Python中调用一个函数并给该函数传递一些参数时......这些参数是按值传递(passed by value?)的吗?不对!引用传递(passed by reference)?还不对的!他们实际上是通过了赋值传递( passed by assignment)。 Introduction 介绍 许多传统编程语言在向函数传递参数时采用以下两种模型之一: 一些语言使用传值模型; 其他大多数使用引用传递模型。 话虽如此,了解 Python 使用的模型很重要,因为这会影响代码的行为方式。 在这个 Pydon 中,你将学习到如下的知识点: 看到Python不使用按值传递或按引用传递模型; 了解 Python 使用传递赋值的模型; 了解内置函数 id ; 更好地理解 Python 对象模型; 认识到每个对象都有 3 个非常重要的属性; 了解可变对象和不可变对象之间的区别; 了解浅拷贝和深拷贝之间的区别;以及 了解如何使用模块 copy 进行这两种类型的对象复制。 Python 是按值传递吗? 在按值传递模型中,当您使用一组参数调用函数时,数据将被复制到该函数中。这意味着您可以在函数内部随意修改参数,并且无法更改函数外部的程序状态。这不是Python所做的,Python不使用传值模型。 查看下面的代码片段,Python 可能看起来使用了值传递: def foo(x): x = 4 a = 3 foo(a) print(a) # 3 这看起来像传值模型,因为我们给函数传递 3,函数将其更改为 4,并且更改没有反映在外部( a 仍然是 3)。所以看起来好象是函数内部复制了一份传递的参数,所以行为和按值传递一样了。 但事实上,Python 并没有将数据复制到函数中。 为了证明这一点,我将向您展示一个不同的函数: def clearly_not_pass_by_value(my_list): my_list[0] = 42 l = [1, 2, 3] clearly_not_pass_by_value(l) print(l) # [42, 2, 3] 正如我们所看到的,在函数外部定义的列表 l 在调用函数 clearly_not_pass_by_value 后发生了变化。因此,Python 不使用传值模型。 Pyth...