fazerse 发表于 2020-8-16 16:05:49

收集参数与关键字参数的一段程序

课程中介绍,如果在收集参数后再带另一个参数的话,要用关键字参数,不然会报错, 在实践这段过程时,碰到个问题
>>> def test(*pamas, unit='个'):
                 print ('参数个数=',len(pamas),unit)

       
>>> test(1,2,3,4,unit)
Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
    test(1,2,3,4,unit)
NameError: name 'unit' is not defined

===========================================================
已经在 定义函数时指定了unit, 然后 调用时,还说unit 为定义。 这是什么原理?   发现如果调用时,不加unit ,代码又能跑通

zltzlt 发表于 2020-8-16 16:07:06

Python 会把你 test(1,2,3,4,unit) 这里的 unit 看作是一个变量,这个变量不存在,所以会报错。

永恒的蓝色梦想 发表于 2020-8-16 16:15:20

test(1,2,3,4,unit=None)

小甲鱼的铁粉 发表于 2020-8-16 16:17:09

这样是不会报错的
>>> def test(*pamas, unit='个'):
               print ('参数个数=',len(pamas),unit)

>>> test(1,2,3,4)
参数个数= 4 个
>>>

小甲鱼的铁粉 发表于 2020-8-16 16:18:39

这在里面你只输入一个unit的话会被当做一个传入函数的变量处理的,但是并没有声明unit,所以报错test(1,2,3,4,unit)

小甲鱼的铁粉 发表于 2020-8-16 16:19:39

本帖最后由 小甲鱼的铁粉 于 2020-8-16 16:20 编辑

需要使用unit=   去传入

Twilight6 发表于 2020-8-16 16:47:22

已经在 定义函数时指定了unit, 然后 调用时,还说unit 为定义。 这是什么原理?   发现如果调用时,不加unit ,代码又能跑通

定义函数时候,函数的 unit 是指在函数作用域的 unit,而你传入参数时候的 unit 是在全局作用域寻找 unit 变量的值

而你全局作用域没有定义 unit 所以导致你报错了,而且你定义参数时候设置了 unit = '个' 意思是设置函数的默认值为 个,当你不传入关键字参数时候 这个 unit 就等于 '个' 这个字符串

所以你直接这样调用即可:

def test(*pamas, unit='个'):
    print('参数个数=', len(pamas), unit)

test(1,2,3,4)



fazerse 发表于 2020-8-16 23:00:03

Twilight6 发表于 2020-8-16 16:47
定义函数时候,函数的 unit 是指在函数作用域的 unit,而你传入参数时候的 unit 是在全局作用域寻找 un ...

我再过一遍 局部变量和全局变量{:9_222:}
页: [1]
查看完整版本: 收集参数与关键字参数的一段程序