在 Python 中解压字典时,单(非双)星号 * 是什么意思?
What does single(not double) asterisk * means when unpacking dictionary in Python?
谁能解释一下使用单星号或双星号解压字典时的区别?你可以在函数参数中提到它们的区别,只有在这里相关,我不这么认为。
但是,可能存在一些相关性,因为它们共享相同的星号语法。
def foo(a,b)
return a+b
tmp = {1:2,3:4}
foo(*tmp) #you get 4
foo(**tmp) #typeError: keyword should be string. Why it bothers to check the type of keyword?
此外,为什么在这种情况下,当作为函数参数传递时,字典的键不允许是非字符串?有没有例外?他们为什么这样设计Python,是因为编译器无法推导出这里的类型还是什么?
谢谢!
这是一个扩展的可迭代拆包。
>>> def add(a=0, b=0):
... return a + b
...
>>> d = {'a': 2, 'b': 3}
>>> add(**d)#corresponding to add(a=2,b=3)
5
对于单身*,
def add(a=0, b=0):
... return a + b
...
>>> d = {'a': 2, 'b': 3}
>>> add(*d)#corresponding to add(a='a',b='b')
ab
了解更多 here。
def foo(a,b)
return a+b
tmp = {1:2,3:4}
foo(*tmp) #you get 4
foo(**tmp)
在这种情况下:
foo(*tmp)
意思是 foo(1, 3)
foo(**tmp)
表示 foo(1=2, 3=4)
,这将引发错误,因为 1
不能作为参数。 Arg 必须是字符串并且(感谢@Alexander Reynolds 指出这一点)必须以下划线或字母字符开头。参数必须是有效的 Python 标识符。这意味着你甚至不能做这样的事情:
def foo(1=2, 3=4):
<your code>
或
def foo('1'=2, '3'=4):
<your code>
有关详细信息,请参阅 python_basic_syntax。
当字典作为列表迭代时,迭代采用它的键,例如
for key in tmp:
print(key)
与
相同
for key in tmp.keys():
print(key)
在这种情况下,解包为 *tmp
等同于 *tmp.keys()
,忽略值。如果您想使用这些值,您可以使用 *tmp.values()
.
双星号用于定义带有关键字参数的函数,例如
def foo(a, b):
或
def foo(**kwargs):
在这里您可以将参数存储在字典中并将其作为 **tmp
传递。在第一种情况下,键必须是带有函数公司中定义的参数名称的字符串。在第二种情况下,您可以使用 kwargs
作为函数内部的字典。
我认为函数参数和解包字典中的**双星号直观的意思是这样的:
#suppose you have this function
def foo(a,**b):
print(a)
for x in b:
print(x,"...",b[x])
#suppose you call this function in the following form
foo(whatever,m=1,n=2)
#the m=1 syntax actually means assign parameter by name, like foo(a = whatever, m = 1, n = 2)
#so you can also do foo(whatever,**{"m":1,"n":2})
#the reason for this syntax is you actually do
**b is m=1,n=2 #something like pattern matching mechanism
so b is {"m":1,"n":2}, note "m" and "n" are now in string form
#the function is actually this:
def foo(a,**b): # b = {"m":1,"n":2}
print(a)
for x in b: #for x in b.keys(), thanks to @vlizana answer
print(x,"...",b[x])
现在所有语法都有意义了。单个星号也是如此。唯一值得注意的是,如果你使用单星号解包字典,你实际上是在尝试以列表方式解包,并且只解包字典的键。
谁能解释一下使用单星号或双星号解压字典时的区别?你可以在函数参数中提到它们的区别,只有在这里相关,我不这么认为。
但是,可能存在一些相关性,因为它们共享相同的星号语法。
def foo(a,b)
return a+b
tmp = {1:2,3:4}
foo(*tmp) #you get 4
foo(**tmp) #typeError: keyword should be string. Why it bothers to check the type of keyword?
此外,为什么在这种情况下,当作为函数参数传递时,字典的键不允许是非字符串?有没有例外?他们为什么这样设计Python,是因为编译器无法推导出这里的类型还是什么?
谢谢!
这是一个扩展的可迭代拆包。
>>> def add(a=0, b=0):
... return a + b
...
>>> d = {'a': 2, 'b': 3}
>>> add(**d)#corresponding to add(a=2,b=3)
5
对于单身*,
def add(a=0, b=0):
... return a + b
...
>>> d = {'a': 2, 'b': 3}
>>> add(*d)#corresponding to add(a='a',b='b')
ab
了解更多 here。
def foo(a,b)
return a+b
tmp = {1:2,3:4}
foo(*tmp) #you get 4
foo(**tmp)
在这种情况下:
foo(*tmp)
意思是 foo(1, 3)
foo(**tmp)
表示 foo(1=2, 3=4)
,这将引发错误,因为 1
不能作为参数。 Arg 必须是字符串并且(感谢@Alexander Reynolds 指出这一点)必须以下划线或字母字符开头。参数必须是有效的 Python 标识符。这意味着你甚至不能做这样的事情:
def foo(1=2, 3=4):
<your code>
或
def foo('1'=2, '3'=4):
<your code>
有关详细信息,请参阅 python_basic_syntax。
当字典作为列表迭代时,迭代采用它的键,例如
for key in tmp:
print(key)
与
相同for key in tmp.keys():
print(key)
在这种情况下,解包为 *tmp
等同于 *tmp.keys()
,忽略值。如果您想使用这些值,您可以使用 *tmp.values()
.
双星号用于定义带有关键字参数的函数,例如
def foo(a, b):
或
def foo(**kwargs):
在这里您可以将参数存储在字典中并将其作为 **tmp
传递。在第一种情况下,键必须是带有函数公司中定义的参数名称的字符串。在第二种情况下,您可以使用 kwargs
作为函数内部的字典。
我认为函数参数和解包字典中的**双星号直观的意思是这样的:
#suppose you have this function
def foo(a,**b):
print(a)
for x in b:
print(x,"...",b[x])
#suppose you call this function in the following form
foo(whatever,m=1,n=2)
#the m=1 syntax actually means assign parameter by name, like foo(a = whatever, m = 1, n = 2)
#so you can also do foo(whatever,**{"m":1,"n":2})
#the reason for this syntax is you actually do
**b is m=1,n=2 #something like pattern matching mechanism
so b is {"m":1,"n":2}, note "m" and "n" are now in string form
#the function is actually this:
def foo(a,**b): # b = {"m":1,"n":2}
print(a)
for x in b: #for x in b.keys(), thanks to @vlizana answer
print(x,"...",b[x])
现在所有语法都有意义了。单个星号也是如此。唯一值得注意的是,如果你使用单星号解包字典,你实际上是在尝试以列表方式解包,并且只解包字典的键。