http://docs.python.org/2/reference/expressions.html#operator-precedence
我的猜测是它落入了dict查找之上的一个桶中
func(*mydict[mykey])
Run Code Online (Sandbox Code Playgroud)
字典首先查找.有没有比我的初始链接更好的图表,更详细地介绍了python中的操作顺序?
拆包*不是操作员;它是调用语法的一部分。它在Calls下定义,您可以在其中看到:
["," "*" expression]
Run Code Online (Sandbox Code Playgroud)
... 可以argument_list在两个不同的地方成为 an 的一部分。(语义在“如果有更多位置……”和“如果语法……”的段落中进行了描述。)
所以它需要任何expression. 您可以看到没有运算符将 fullexpression作为其直接参数。所以,如果你想松散地考虑*一个运算符,它比任何运算符都更松散地绑定。但请记住,它实际上不是运算符。
还要记住,这一切都在 Python 3.x 中改变了。但基本思想是相同的——参数解包和赋值解包都采用 an expression,而不仅仅是 a primary,因此松散地说绑定比任何运算符都更松散,它们都采用 aprimary或更具体的东西。
同时,您可能想尝试在您的代码上运行解析器以查看它的作用:
>>> import ast
>>> tree = ast.parse('func(*mydict[mykey])')
>>> ast.dump(tree)
"Module(body=[Expr(value=Call(func=Name(id='func', ctx=Load()), args=[], keywords=[],
starargs=Subscript(value=Name(id='mydict', ctx=Load()),
slice=Index(value=Name(id='mykey', ctx=Load())), ctx=Load()), kwargs=None))])"
Run Code Online (Sandbox Code Playgroud)
您可以看到整个Subscript表达式starargs以 the结尾Call。
该ast模块使用抽象语法而不是参考手册中描述的语法。它对事物有不同的名称,并且不处理一些被认为是语法的一部分但实际上在比解析器更高的级别上完成的事情,等等——但是,另一方面,它更容易接受一次全部。你可以看到一个exprused forstarargs可以是 a Subscript。