2009-05-13 13 views
1

今日、私はquestion に辞書値を関数に渡すことを頼んだ。今私が理解しようとしていることは、私が達成しようとしていることを達成しようとしていた理由(質問されなかった)が決して答えられなかったことです。だから、私のフォローアップはなぜできないのですか?ディクショナリ値への直接参照を関数に渡すことができないのはなぜですか?

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

これは単にパーサーの規則がこれを許さないためですか?私は+ Python +関数+ "許容可能なパラメータ"のためのグーグルと有用な何かを見つけることがなかったので、私は任意の情報を感謝します。

私は何が起こっているかを単純化しています。私は私が言ったように私は私が欲しかった-Iはどのような非常に有用な答えを持って行う方法を知って、

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

のように構成されている辞書を持っています。しかし、私は、なぜ

def myFunction(outerkey,myDict[outerkey]): 

を思って始め細かく構文解析に問題なければならないことを私に発生した構文エラーを示します。

答えて

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

ありがとう、これは後でいくつかの興味深い読書を与えるでしょう。 – PyNEwbie

+0

newDict ['bubba']は有効な識別子ではありません。文法を理解する方法を学ぶことは、その理解に役立つでしょう。私がこのラインを打ち始めると、関数が呼び出されたときに関数newDict ['bubba']が関数を動作させたいことを参照しているので、動作するはずです。解決策は、コールの参照の前に**を使用し、定義内の名前の前に**を使用することでしたが、他の人が記述しているように、私は理解できませんでした(そして今は表面的なレベルでのみ行います)。回答。私が退屈して文法を読むとうまくいけば、もう一度感謝するでしょう – PyNEwbie

+1

Pythonでは、識別子(オブジェクトの名前)には文字、数字、および下線しか使用できません。文法で 'newDict ['bubba']'がオブジェクトに名前を付けるシンボルとして許可されていれば、オブジェクトの名前のシンボルとリスト/辞書のサブスクリプトの動作の違いを伝えることができません。さらに、newDict ['bubba'] 'を識別子として使うことができれば、' newDict'は有効な識別子ではないので、混乱するでしょう。 – cdleary

2

それ関数の定義とその機能を持つの間で混乱するかもしれないように見えます。簡単な例として、

この機能自体は何もしません(つまり、何も印刷しません)。これをソースファイルに入れて実行すると、何も出力されません。しかし、あなたが追加した場合:

f(5) 

あなたは出力 "x平方は25"になります。 Pythonが関数の名前に続いて実際のパラメータを受け取ると、関数定義内のフォーマルのパラメータにそれらの実際のパラメータの値を代入します。この場合、仮パラメータはxとなります。そして、Pythonは今、大きな利点は、あなたが別の値で再び同じ機能を使用することができている5としてxの値で機能fを実行します:

f(10) 

プリントを「乗×100です」。

私は私が正しくあなたの難しさの原因を理解してきました願っています。

+0

いいえ私は私の機能を定義したいと思っていたと思っていたのですが、後で のキーをmyDictに入れました: result = myFunction(outerKey、myDict [innerKey]) 私は良い答えを得ました。元のアプローチは機能しませんでした – PyNEwbie

2

あなただけのオブジェクトへの参照を渡すことができます。

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

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

f(a['b']) 

期待どおりですか?辞書要素a['b']は、辞書要素を更新する関数fに "参照によって"渡されます。

+0

これは面白くて、私が今日働いていたソリューションよりも簡単に見え、うまくいきます。クールだから2つの答えを受け入れることはできますか? – PyNEwbie

+0

彼は*参照型*(リスト)を渡しています。このように['a']を渡すと、dictionary_value + = 2を実行しても[a ']には影響しません。値型と参照型の違いを理解することが重要です! – cdleary

+1

すべてが参考になります。 「参照型」と「値型」の間には、有用な区別はありません。ただし、一部のタイプは不変です。この不変性により、JavaまたはC++で '値'型のように見えます。 –

関連する問題