![見出し画像](https://assets.st-note.com/production/uploads/images/139312486/rectangle_large_type_2_2372c17c882a7ac964b79b967c67e465.jpeg?width=1200)
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)
このように接続を繰り返したりと、変なことを書いていました。一応意図した動作をしていたので、もう良いものと思い込んでいましたが・・・。
自分レベルの初心者がやっていることを「リファクタリング」などと表現するといかにも大げさかもしれませんが、整理・修正しないといけません。