博文

值传递,引用传递,赋值传递,一文理解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...

Python的内置函数sorted,从入门到放弃

Python 内置函数 sorted Python 内置函数 sorted 用法 1 :基本用法 最简单的用法: sorted 函数默认是升序 import random lst = [random.randint(- 10 , 10 ) for _ in range ( 8 )] print (lst) print ( sorted (lst)) 结果如下: [-5, 9, -7, -7, 4, -5, -6, 6] [-7, -7, -6, -5, -5, 4, 6, 9]   sorted 函数支持 reverse 参数,该参数默认值是 False ,表示升序,调用时传入 True ,表示降序: import random lst = [random.randint(- 10 , 10 ) for _ in range ( 8 )] print (lst) print ( sorted (lst, reverse = True )) 结果如下: [-8, 7, -10, 8, 6, 2, 10, -9] [10, 8, 7, 6, 2, -8, -9, -10]   sorted 函数支持 key 参数, key 参数可以设置排序的规则,通常可以传入可调用对象, python 中的可调用对象有很多,常用的有函数, lambda ,类等等: import random lst = [random.randint(- 10 , 10 ) for _ in range ( 8 )] print (lst) print ( sorted (lst, key = abs )) 结果如下: [7, -10, 1, -4, 4, 8, 5, 3] [1, 3, -4, 4, 5, 7, 8, -10] 这里解释一下,我传递内置函数 abs 给 key 参数,那么 sorted 就会用原元素的绝对值来排序,比如 7 的绝对值是 7 , -10 的绝对值是 10 , … 3 的绝对值是 3 , sorted 函数在内部比较的时候用的是这些原元素的绝对值来做比较操作的。 -10 的绝对值在此例是最大的,所有排在最右边(默认是升序,我没有改变 reverse 参数)。 ...