python系列教程193

40 阅读2分钟

朋友们,如需转载请标明出处:blog.csdn.net/jiangjunsho…

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的教学网站。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

为了说明参数的工作方式,先看看如下的代码:

>>>def f(a):     # a is assigned to (references) passed object

...    a = 99    # Changes local variable a only

...

>>>b = 88

>>>f(b)          # a and b both reference same 88 initially

>>>print(b)      # b is not changed

88

在这个例子中,在使用f(b)调用函数的时候,变量a赋值了对象88,但是,a只是存在于调用的函数之中。在函数中修改a对于调用函数的地方没有任何影响。

对函数中的一个参数名的赋值(例如,a=99)不会影响到函数调用作用域中的b这样的一个变量。

但是当参数传递像列表和字典这样的可修改对象的时候,对这样的对象的原处修改在函数退出后依然有效,并由此影响到调用者。如下例所示

>>>def changer(a,b):    # Arguments assigned references to objects

...    a = 2             # Changes local name's value only

...    b[0] = 'spam'     # Changes shared object in-place

...

>>>X = 1

>>>L = [1,2]            # Caller

>>>changer(X,L)         # Pass immutable and mutable objects>>>X,L # X is unchanged,L is different!

(1,['spam',2]

在这段代码中,changer函数给参数a赋值,并给参数b所引用的一个对象元素赋值。这两个函数内的赋值从语法上仅有一点不同,但是从结构上看却大相径庭。 •因为a是在函数作用域内的本地变量名,第一个赋值对函数调用者没有影响,它仅仅把本地变量a修改为引用一个完全不同的对象,并没有改变调用者作用域中的名称X的绑定。 •b也是一个本地变量名,但是它被传给了一个可变对象(在调用者作用域中叫做L的列表)。所以对函数中b[0]进行赋值的结果会在函数返回后影响L的值。实际上,changer中的第二条赋值语句没有修改b,我们修改的是b当前所引用的对象的一部分。