为什么我不能直接引用字典值到函数?

时间:2009-05-13 00:25:54

标签: python function dictionary parameters

今天早些时候我问question 关于将字典值传递给函数。虽然我现在明白如何完成我想要完成的事情,但为什么问题(未被问到)从未得到回答。所以我的跟进就是为什么我不能

def myFunction(newDict['bubba']):
    some code to process the parameter

是否只是因为解析器规则不允许这样做?我用Google搜索+ Python +函数+“允许参数”,但没有找到任何有用的信息,所以我会感激任何信息。

我过分简化了正在发生的事情。我有一个结构类似

的字典
myDict={outerkey1:(innerkey1:value,innerkey2:value,. . .innerkeyn:value),outerkey2:(innerkey1:value,innerkey2:value,. . .innerkeyn:value),. . .}

正如我所说,我知道如何做我想做的事 - 我得到了一个非常有用的答案。但我开始想知道为什么

 def myFunction(outerkey,myDict[outerkey]):

给出了一个语法错误,我发现它必须是一个解析问题。

3 个答案:

答案 0 :(得分:6)

是的,解析器将拒绝此代码。

参数列表用于函数定义,以将函数内的标识符绑定到从外部调用传入的参数。

由于newDict['bubba']不是有效的标识符,因此没有任何意义 - 您需要将其作为调用参数而不是函数参数提供,因为函数参数只能是标识符。

因为您似乎对formal grammar感兴趣,所以以下是相关部分:

funcdef ::= 
             [decorators] "def" funcname "(" [parameter_list] ")"
              ":" suite

parameter_list ::= 
                 (defparameter ",")*
                (~~"*" identifier [, "**" identifier]
                 | "**" identifier
                 | defparameter [","] )

defparameter ::= 
             parameter ["=" expression]

identifier ::= 
             (letter|"_") (letter | digit | "_")*

实际上,您尝试用作标识符的构造是订阅:

subscription ::= 
             primary "[" expression_list "]"

答案 1 :(得分:2)

看起来您可能会混淆函数的定义调用该函数。举个简单的例子:

def f(x):
    y = x * x
    print "x squared is", y

这个函数本身没有做任何事情(即它不会打印任何东西)。如果将其放在源文件中并运行它,则不会输出任何内容。但是如果你添加:

f(5)

你会得到输出“x平方是25”。当Python遇到函数的名称后跟 actual 参数时,它会将这些实际参数的值替换为函数定义中的 formal 参数。在这种情况下,形式参数称为x。然后Python运行函数f,其值为x为5.现在,最大的好处是您可以使用不同的值再次使用相同的函数:

f(10)

打印“x平方为100”。

我希望我能正确理解你的困难来源。

答案 2 :(得分:2)

您只能传递对象的引用。

a = { 'a' : 123, 'b' : [ 1, 2, 3 ] }

def f(dictionary_value):
    dictionary_value.append(4)

f( a['b'] )

你的期望吗?字典元素a['b']通过“引用”传递给更新字典元素的函数f