- ベストアンサー
[python] 関数から配列を戻すには?
グローバル変数(配列)の値を変えたいと思います。 ------------- line = [] def tmp_read(self, *out_line): f = open('tmp.txt') lines2 = f.readlines() # 1行毎にファイル終端まで全て読む(改行文字も含まれる) f.close() # lines2: リスト。要素は1行の文字列データ for line in lines2: print line, print *out_line = lines2 return *out_line tmp_read(self, *line) print line ← 配列Lineの内容を確認する ------------- この「line」には、文字列を含む配列を入れる予定です。 lines2で得られた値を、戻せば出来そうな気もしますが巧くいきません。 どのように修正すれば酔いか、教えて頂けませんか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず最初に、変数に「*」のシンボルは使えないはずですが。SyntaxErrorが出ませんか? Pythonでは自動的に、配列やクラスの受け渡しはすべてポインターで行われます。これはすごく重要なポイントです。 temp_read関数内に入った時、out_lineというポインターは「line」の配列を差しています。 そして「out_line = line2」の部分で、out_lineというポインターに、「line2」の配列を差すよう上書きしています。 ここで変化しているのは、out_lineというポインター変数だけです。元のline配列には何の変化もおきていないのです。 この問題を解決する為には、out_lineがもともと差している配列(=line)の中に、line2の中身を1つずつコピーする必要があります。具体的には、このようにします。 for line in lines2: out_line.append(line) この辺の違いは、C言語でのポインターの取り扱いに慣れていないと、なかなか理解するのは大変だと思います。 正しい関数は、こうなります。 ↓ def tmp_read(self, out_line): f = open('tmp.txt') lines2 = f.readlines() f.close() for line in lines2: out_line.append(line) print line return
その他の回答 (2)
- rinkun
- ベストアンサー率44% (706/1571)
配列(リスト)を戻したいというなら def tmp_read(): f = open('tmp.txt') lines2 = f.readlines() f.close() for line in lines2: print line return line2 line = tmp_read() print line でしょう。 # インデントを見せるため全角空白を使っています リストは自由に作れますし関数から返せますから、C言語的にバッファを渡して書き換える必要はありません。
お礼
有難う御座います。 どうも、C言語に慣れきってしまっている所為か、pythonの流儀にはまだ慣れておりません。 勉強になりました。 m(_ _)m
- sakusaker7
- ベストアンサー率62% (800/1280)
tmp_read からリスト(配列)を返せばいいだけと思いますが、 関数の中で書き換えをしたいということならこういう手もあります。 line = [] def tmp_read(out_line): ____f = open('tmp.txt') ____out_line[:] = f.readlines() ____f.close() print line tmp_read(line) print line 実行するとこんな感じ。 python moge.py [] ['aaa\n', 'bbb\n', 'cccc\n', 'dddd\n', 'eee\n', 'fff\n']
お礼
有難う御座います。 自分が書いたのより、とてもシンプルに成っていますね。
お礼
有難う御座います。 ポインター変数が基本なのかなあ。