为什么我不能直接将字典值的引用传给函数?

1 投票
3 回答
2525 浏览
提问于 2025-04-15 11:33

今天早些时候,我在网上问了一个关于如何把字典的值传给函数的问题。虽然我现在明白了怎么做我想做的事情,但我心里一直有个“为什么”的疑问(这个问题没有被问到)。所以我想进一步了解,为什么我不能这样做。

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

这是不是因为解析器的规则不允许这样做呢?我在网上搜索了关于Python函数和“允许的参数”的信息,但没有找到有用的资料,所以我希望能得到一些帮助。

我可能把事情说得太简单了。我有一个字典,它的结构像这样:

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

正如我所说,我知道怎么做我想做的事情——我得到了一个非常有帮助的答案。但我开始想,为什么

 def myFunction(outerkey,myDict[outerkey]):

会出现语法错误,后来我意识到这可能是一个解析问题。

3 个回答

2

看起来你可能对函数的定义调用这两个概念有些混淆。举个简单的例子:

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

单独来看,这个函数什么也不做(也就是说,它不会输出任何东西)。如果你把它放在一个源文件里运行,什么也不会显示。但是,如果你再加上:

f(5)

你就会看到输出“x的平方是25”。当Python遇到函数的名字后面跟着实际参数时,它会把这些实际参数的值替换到函数定义里的形式参数中。在这个例子里,形式参数叫做x。然后Python会用5作为x的值来运行函数f。这样一个大好处是,你可以用不同的值再次使用同一个函数:

f(10)

会输出“x的平方是100”。

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

2

你只能传递对象的引用。

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

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

f( a['b'] )

这就是你所期望的效果。字典中的元素 a['b'] 是以“引用”的方式传递给函数 f 的,这样函数就可以更新这个字典元素。

6

是的,这段代码会被解析器拒绝。

参数列表是在函数定义中用来把函数内部的标识符和外部传入的参数绑定在一起的,只有在调用时才会发生这种绑定。

因为 newDict['bubba'] 不是一个有效的标识符,所以这样写是没有意义的——你需要把它作为调用参数提供,而不是作为函数参数,因为函数参数只能是标识符。

因为你似乎对正式语法感兴趣,这里有相关的部分:

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 "]"

撰写回答