2012-02-19 3 views
3

のは、私はこの機能を持っているとしましょう:今、何が起こる 関数内で完全に異なる引数名を渡すとどうなりますか?

current_line = 3 
print_a_line(current_line, current_file) 

def print_a_line(line_count, f): 
    print line_count, f.readline() 

私はでそれを呼び出しますか? line_count = 3か、それともline_count = current_line = 3ですか?私は別の引数名を渡すと(私が代わりにLINE_COUNTのCURRENT_LINEで、ここで行ったように?)

はまた、それが悪いことだ

+3

[コンピュータサイエンティストのように考える方法](http://greenteapress.com/thinkpython/html/)のような、プログラミングの良い紹介を読むことをお勧めします。特に[このサブセクション](http://greenteapress.com/thinkpython/html/book004.html#toc32)を参照してください。 –

+1

このPythonチュートリアルhttp://people.csail.mitを見てみることをお勧めします。edu/pgbovine/python/tutor.html#mode =編集。 Pythonコードの小さなスニペットの実行を視覚化するのに最適な方法ですので、プログラムのさまざまな段階で変数がどうなるかを深く理解することができます。 –

+0

@AndrewKurinnyiありがとうございました。 – 0101amt

答えて

4

今どうなりますか? line_count = 3か、それともline_count = current_line = 3ですか?

line_countは、print_a_lineの呼び出しの中で3にバインドされています。変数current_lineは、呼び出しの影響を受けません。

私は別の引数名を渡すと(私が代わりにLINE_COUNTのCURRENT_LINEで、ここで行ったように?)また、それが悪いことだ

それは全く悪いことではないのです。名前付き引数ではなく、定位置引数を使用しています。

Pythonには、位置引数と名前付き引数の2種類の引数があります。上の関数print_a_lineのように宣言された関数は、位置引数だけを使用しています。唯一の名前付き引数を持つ関数は、位置と名前付き引数の両方を持つ関数は、位置引数は、位置と呼ばれていることを

def print_a_line_2(line_count, f, append_newline=True): 
    if append_newline: 
     print line_count, f.readline() 
    else: 
     print line_count, f.readline(), 

理由であるように見えるかもしれません

def print_a_line_2(line_count=3, f=None): 
    if f is not None: 
     print line_count, f.readline() 

のようになります。その引数の位置のみあなたは問題を渡す。したがって、あなたは好きな2つの式をprint_a_lineの引数として書くことができ、最初に渡される引数はline_countにバインドされ、print_a_lineの実行中にはfにバインドされます。

という名前の引数の場合は、の場合はそうではありませんが、構文はそこでは異なります。名前付き引数を渡すには、単にexpressionと書くのではなく、name=expressionと書いてください。だから、あなたは

print_a_line_2(line_count=3, f=current_file) 

を書くことができ、print_a_line_2を呼び出し、前に等号が等号の後でないものを、署名が何であるかを引数の名前から来ています。

名前付き引数と定位置引数については、the Python tutorialをチェックアウトすることをおすすめします。

EDIT:あなたは(line_count(current_line, current_file)

ザ・Pythonインタプリタはあなたのプログラムに関するいくつかの情報を維持し、それは維持の重要な事柄のいくつかは、シンボルテーブルあり、名前を結合する呼び出すたび何がボンネットの下に起こります変数)を値に、現在のステートメントポインタを返します。現在の文ポインタがライン

print_a_line(current_line, current_file) 

に達するたびにPythonインタプリタは、print_a_lineを見上げcurrent_line、およびシンボルテーブルにcurrent_file。それはprint_a_lineがあなたの質問で定義した関数にバインドされており、current_lineは3にバインドされており、current_fileはファイルオブジェクトにバインドされていることがわかります(これは大きな実装定義のデータ構造です。 Fは大文字のFと小文字の小文字の区別があります(fで少しお会いします)。 print_a_lineが関数であるため、インタプリタは引数3とFで関数を呼び出します。これを実行するには、現在の実行状態を保存し、変数line_countを3に、fをシンボルテーブルのFにバインドし、

print line_count, f.readline() 

それはそれはシンボルテーブル内のすべての変数を探して、元の関数の呼び出しを実行するのと同じ方法でprint声明を内蔵しており、作りを実行しているprint_a_line関数の最初の行関数呼び出しはprint_a_lineへの全体関数呼び出しと同じ方法でf.readline()に呼び出します。次に、print_a_line関数が返ってくると、Pythonインタプリタはシンボルテーブルからline_countfを削除し、以前に保存した位置にステートメントポインタを戻します。 print_a_lineの呼び出し後、コード行で実行を続けます。

+0

そして、current_lineをprint_a_line関数に渡すと "closed doors"の下で何が起こりますか?変数line_countにはline_count = current_line = 3のようなものが含まれていますか、単にcurrent_line(line_count = 3) – 0101amt

+2

から値をコピーしますか?値は '3'を参照する' current_line'と 'line_count'の両方で終わります。 – yak

+0

@ 101amt Yakが正しいです。私の編集でより明確にしたように、 'current_line'と' line_count'の両方は値3を参照しています。私は今、 "閉じたドア"の下で何が起こるかをもっと分かりやすくするために2番目の編集をしています。 –

3

あなたは混乱しています。 main

def print_a_line(line_count, f): 
    print line_count, f.readline() 

def main(): 
    current_line = 3 
    print_a_line(current_line, current_file) 

if __name__ == "__main__": 
    current_file = open('file.txt') 
    main() 

、あなたはcurrent_line=3を持っている、とcurrent_lineがローカル変数である:のは、あなたのファイルは、次のようになりますと仮定しましょう。 print_a_lineのメソッドと変数current_fileはグローバルなので、mainで使用できます。 print_a_lineには、ローカル変数line_countfがあり、それぞれcurrent_linecurrent_fileと同じです。しかし、current_linemainにローカルであり、line_countはローカルでprint_a_lineにローカルなので、current_line == line_countTrueと評価される範囲はありません。

これは決して悪いことではありません。同じ値は、異なるスコープの異なるものを意味する可能性があり、変数の名前にはこれを反映する必要があります。

1

他の人がおすすめしている場所で読むことができます。定義時や関数呼び出し時に別の名前を使うことは悪いことではありません。実際には、スコープとそのすべてをよく理解するまで、私はそれをお勧めします。