電子書籍の厳選無料作品が豊富!

グローバル変数(配列)の値を変えたいと思います。
-------------
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で得られた値を、戻せば出来そうな気もしますが巧くいきません。

どのように修正すれば酔いか、教えて頂けませんか。

A 回答 (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
    • good
    • 0
この回答へのお礼

有難う御座います。

ポインター変数が基本なのかなあ。

お礼日時:2009/09/24 09:16

配列(リスト)を戻したいというなら


 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言語的にバッファを渡して書き換える必要はありません。
    • good
    • 0
この回答へのお礼

有難う御座います。

どうも、C言語に慣れきってしまっている所為か、pythonの流儀にはまだ慣れておりません。

勉強になりました。 m(_ _)m

お礼日時:2009/09/24 09:27

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']
    • good
    • 0
この回答へのお礼

有難う御座います。

自分が書いたのより、とてもシンプルに成っていますね。

お礼日時:2009/09/24 09:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!