请问为何关键字参数接收时要用赋值?

2016-08-02 11:33:20 +08:00
 Newyorkcity
ef person(name,age,**other):
print('name:',name,'age:',age,'other:',other)

person('Syx', 18, city = 'Chengdu', hometown = 'Hangzhou')
这是一个能通过编译的有意义的操作
person('Syx', 18, 'city' : 'Chengdu', 'hometown' : 'Hangzhou')
这却是一个不能通过编译的代码.
我不理解,对于**other (关键字参数)输入进来的数据都会被处理成 dict 对吧?
如果我自己建立一个 dict,应该是这么写:
extra = {'city' : 'Beijing', 'hometown' : 'Hangzhou'}
也就是说第二行代码中的〈'city' : 'Chengdu', 'hometown' : 'Hangzhou'〉才是真正的 dict 格式啊.为什么第二行代码是错误的,但第一行是正确的?
我也无法理解这里这个赋值的操作.
在第一行代码的下一行我紧接着写了
print(city)
可是被告知
city is not defined
那 city = 'Chengdu'到底是个什么东西?

谢谢
1716 次点击
所在节点    Python
8 条回复
mgna17
2016-08-02 12:08:44 +08:00
关键字参数传入函数之后的确就变成一个字典了,你可以试一下 print(type(other))
函数上的**other 接收了所有键值对,并封装成了一个叫做 other 的字典
你要的 city 应该是 other.get('city')
iEverX
2016-08-02 13:18:02 +08:00
这里不是赋值操作,只是语法规定而已
Newyorkcity
2016-08-02 13:44:11 +08:00
@mgna17
谢谢你的解答,但还有几个问题..
传入函数之后形成的字典可以被调用么?
from myfunction_2 import person
person('Syx', 18, city = 'Beijing', hometown = 'Hangzhou')
print(other[0])
第三行代码被报错,是 other 没有被定义.所以「 print(type(other))」和「 other.get('city')」应该怎么用呢?
Newyorkcity
2016-08-02 13:45:37 +08:00
@iEverX
谢谢..那这样的话请问这里的 city 是一个变量还是一个字符串?
只是因为在规定上禁止了 'city' : 'Beijing' 这种写法并规定了只接受 city = 'Beijing'这种写法么?
iEverX
2016-08-02 13:53:38 +08:00
你从函数里得到的参数,是有函数的声明来确定的

def person(name, age, **other):

这一行说明这个函数接收三个参数, name , age , other

person('Syx', 18, city = 'Chengdu', hometown = 'Hangzhou')
这种调用实际上是相当于 other = {'city': 'Chengdu', 'hometown': 'Hangzhou'},你在函数内部,只能使用 1 楼的方法去获得这个参数
mgna17
2016-08-02 14:07:54 +08:00
@Newyorkcity 我说的那 2 小段代码是放在你定义的那个函数里面的 -_-

至于你问的 “传入函数之后形成的字典可以被调用么? ”,这 2 段不就是在调用那个 other 参数么?
Newyorkcity
2016-08-02 14:46:22 +08:00
@iEverX 谢谢
Newyorkcity
2016-08-02 14:46:28 +08:00
@mgna17 谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/296526

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX