見出し画像

with文と変数のスコープの勘違い

(Python学習初心者の試行錯誤・備忘録です)
 自分が大きく勘違いをしていたポイントを書き留めておきます。 
 たとえばテキストファイル"test.txt"があるとします。これを読み出すときwith文で

with open("test.txt") as tempfile:
    temptext=tempfile.read()
    print(temptext)

として実行すると、ターミナルにテキストファイル"test.txt"の内容が表示されます。これは直感的に分かります。
 さて、temptext という変数は「with文の中」で定義されているので、with文の外からは見えない・・と思いこんでいました。つまり、上のを

with open("test.txt") as tempfile:
    temptext=tempfile.read()

print(temptext)

と書いたら、print文の位置ではtemptext変数が存在せず、エラーになるんじゃないか?と思っていたのですが、当方の勘違いでした。temptextはこの位置でも有効で、表示されます。

ではもう一つ、この場合

with open("test.txt") as tempfile:
    print(tempfile.read())

これは表示される。でもこうやると

with open("test.txt") as tempfile:
    pass

print(tempfile.read())

この場合はエラーになる。with文のas の後に書いたtempfileはwith文の外ではすでに閉じられている。 この手のことを勘違いしていたので、二週間ほど前に調子に乗って「完成」と宣言しちゃったこれ

の中の「コードです」と書いたところで
mydb = "mydb.sqlite3"
が何度も出てきたり

(抜粋)
        mydb = "mydb.sqlite3"
        con =sqlite3.connect(mydb)
        with open(mycsv, newline='', encoding='utf-8') as csvfile:
            con = sqlite3.connect(mydb)

このように接続を繰り返したりと、変なことを書いていました。一応意図した動作をしていたので、もう良いものと思い込んでいましたが・・・。
 自分レベルの初心者がやっていることを「リファクタリング」などと表現するといかにも大げさかもしれませんが、整理・修正しないといけません。

この記事が気に入ったらサポートをしてみませんか?