Python在自定义函数中应用参数传递的一点点心得

对于Python中的参数,可以有如下三种:位置和关键字参数、任意数量的位置参数、任意数量的关键字参数。
我们知道对于Python中的名字的解析被称为LGB规则,有以下三点
1.当在函数中使用一个无限制的名字时,Python依次查找三个作用域:局部(Local)、全局(Global)、内置(Built-in),在第一个发现名字的位置停止。
2.在函数中赋值一个名字时,Python总在局部作用域中生成或者改变它,除非在函数中对它进行了global的声明。
3.在函数外部时,局部作用域与全局作用域等效,都是同一个模块的名字空间。
这里主要讨论一下在自定义函数中应用参数传递的实现,代码如下:

x=1
list=[1,2]
def func(x,y):
    x=2
    y[0]='A'
func(x,list)
print('调用函数后传入的参数变化为:',x,list))
调用函数后传入的参数变化为: 1 ['A', 2]
Process finished with exit code 0

func()对x和被y引用的对象中的组件赋值,x是函数作用域中的局部名字,第1个赋值对调用者没有影响,参数y也是个局部的名字。但传递了y[0],这是一个可变的对象,最后就把list中的第一个位置换掉了!
那我们思考一下,我还想换掉x=1,既利用模块中的x=2,该如何操作。

如果是如下代码块,就会报错:

x=1
list=[1,2]
def func(x):
    global x
    x=2
func()
print('调用函数后传入的参数变化为:',x)
global x
SyntaxError: name 'x' is parameter and global
Process finished with exit code 1

我们看到了报错。语法错误:x既是参数又是全局变量。这样是不对的,x是不能既做变量又做参数的。
那么我们换一种方式,看看是否可以。代码如下:

x=1
list=[1,2]
def func():
    global x
    x=2
    y[0]='A'
func(x,list)
print('调用函数后传入的参数变化为:',x)
func(x,list)
TypeError: func() takes 0 positional arguments but 2 were given
Process finished with exit code 1

好的,又出错了。对类型的无效操作:func()可以接收的位置参数是0个,但却接收到了2个参数(x,list)。这样也是不对的,因为我们在def func()时候,func()中并没有位置参数,而我们在调用func()时,却代入了x,list两个参数,就会报错。

综上所述:fun(x)里有参数x时,后面模块内就不可以跟global x(全局变量),但是func()里无参数x时,后面可以跟global x,把x定义成全局变量,但是呢又有个问题,就是后面调用函数func()时,不能写成func(x),否则又会报错TypeError,是由于前面是func(),故可接受参数为0

那么该如何操作,到达我们想一样换掉x=1,使得x=2呢?这里我运用了两个def func。代码如下:

x=1
list=[1,2]
def func1():
    global x
    x=2
func1()
def func2(y):
    y[0]='A'
func2(list)
print('调用函数参数的结果:',x,list)
调用函数参数的结果: 2 ['A', 2]
Process finished with exit code 0

这里,我们成功的把x=1换成了x=2。但是却用了两个函数,比较繁重,感觉还会有更好的程序,由于这也是我开始学习Python时摸索函数参数过程的一点点感悟吧,希望有Python大佬看到可以给与指导和帮助。

猜你喜欢

转载自blog.csdn.net/weixin_43858010/article/details/108519671
今日推荐