今天早些时候我问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]):
给出了一个语法错误,我发现它必须是一个解析问题。
答案 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
。