質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

912閲覧

webページ制作でlocal variable referenced before assignmentに困っている

sutdy_python1

総合スコア8

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/12/19 10:24

ウェブページを独学している者です。
ウェブページでは、商品名、個数、価格を入力すると、ID順に、商品ごとの小計、合計金額が表示される買い物リストを作ろうとしています。
商品ごとの小計を合計に足しこんで合計を求めたいのですが、
local variable referenced before assignment のエラーが消えません。
どのようにコードを書き換えれば合計をうまく表示できますか。
データベースはsqllite、Pythonを使って簡易的にwebサーバーを立ち上げて動きを確認しています。勉強でやっているので、外部公開はしません。

import cgi, sys, io, sqlite3 def main(): # formで入力された値の取得 form = cgi.FieldStorage() m1 = form.getfirst('name1') m2 = form.getfirst('num1') m3 = form.getfirst('num2') # Windows版pythonのprint()出力はShift-jisなのでUTF-8に変更 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') print("Content-type: text/html; charset=UTF-8") print("") # 改行のみを送るが規格上、必要 print( mkhead() + dbdata(m1, m2, m3) + mktail() ) def dbdata(m1,m2,m3): con = sqlite3.connect("test.db") cur = con.cursor() html = "" cur.execute("INSERT INTO log (name, price, num) values(?,?,?)", (m1,m2,m3) ) cur.execute("SELECT count(*) FROM log") n = cur.fetchone()[0] if n>0: html += """\ <table border="0"> <br> <br> <tr><th>id</th><th>品名</th><th>単価</th><th>数量</th><th>小計</th><tr> """ for row in cur.execute("SELECT * FROM log order by id ASC"): html += "<tr><td align=right>%5d</td><td>%-10s</td><td>%-s</td><td align=right>%-s</td><td>%d</td></tr>"%\ (int(row[0]), row[1], row[2],int(row[3]),int(row[2])*int(row[3])) goukei += int(row[2])*int(row[3]) html += "</table>" con.commit() con.close() return html def mkhead(): goukei = 0 # HTML前半固定部分 return '''\ <!doctype html> <html lang="ja"> <head> <meta charset="utf-8" /> <title>買い物リスト</title> </head> <body> <h1>買い物リスト</h1> <form action="/cgi-bin/dblog.py" method="POST"> <p> 品名<input type="text" name="name1" size="20"> 単価<input type="text" name="num1" value="0"size="10"> 数量<input type="text" name="num2" value="0"size="10"> </p> <input type="submit" value="追加"> <hr/> </form> ''' def mktail(): # HTML後半固定部分 return '''\ </body> </html> ''' # 利用している関数をmainより後で定義するための処置 if __name__=='__main__': main()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2021/12/19 11:11

エラーメッセージは正確ですか? local variable 'xxx' referenced before assignment のようにエラーメッセージに変数名が示されてはいないのですか?
sutdy_python1

2021/12/19 11:20

確認したところ、抜けていました。申し訳ございません。 正しくはlocal variable \'goukei\' referenced before assignment\r\n' です。よろしくお願いいたします。
guest

回答1

0

関数mkheadの中で定義したローカル変数goukeiは、関数dbdataからは見えません。

そこを解決するにはまじめに考えて方が良いでしょう。

手抜きで修正するなら、

pytohn

1def dbdata(m1,m2,m3): 2 global goukei 3 con = sqlite3.connect("test.db") 4

pytohn

1def mkhead(): 2 global goukei 3 goukei = 0

のように、global宣言を入れれば、local variable referenced before assignment のエラーは出なくなります。

公式ドキュメント 4. 実行モデル 4.2. 名前づけと束縛 (naming and binding)には以下のように書かれています。

ある名前がブロック内で束縛されているなら、 nonlocal や global として宣言されていない限り、それはそのブロックのローカル変数 (local variable) です。 ある名前がモジュールレベルで束縛されているなら、その名前はグローバル変数 (global variable) です。 (モジュールコードブロックの変数は、ローカル変数でも、グローバル変数でもあります。) ある変数があるコードブロック内で使われていて、そのブロックで定義はされていないなら、それは自由変数 (free variable) です。

これをよく読むとわかるのですが、最初は難しいかもしれません。

投稿2021/12/19 11:09

編集2021/12/19 11:17
ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問