🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

3回答

2355閲覧

ProcessingをPythonモードで動作中、globalにしたはずの変数がローカル変数扱いになりエラーが出る

doxy

総合スコア2

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

1グッド

0クリップ

投稿2021/03/18 13:01

macOS CatalinaでProcessing 3.5.4をPythonモードに設定してコードを書いています。Pythonのバージョンは3.8.3です。

https://cocopon.me/zero-pde/image/ の冒頭の画像のリンク先にあるサンプルコード
https://github.com/cocopon/zero-pde/blob/master/10-image/advanced/shear/shear.pde
を参考にして、Javaで記されているのをわからないなりになんなく書き換えて、pythonモードで動作するようにすることが出来はしました。
しかし一箇所だけ、エラーがなぜ起きるのかを理解できていません。どうしてこのようになるのかを知りたいです。コードは以下の通りです。

Python

1def setup() : 2 global CELL_SIZE,Y_OFFSET,x,y,img 3 CELL_SIZE = 30 4 Y_OFFSET = 0 5 x = 0 6 y = 0 7 background(0, 0, 0) 8 img = loadImage("test.png") 9 size(1000,1000) 10 image(img,0, 0) 11 12 13 14def draw() : 15 global x,y#←これがないと動かないがなぜそうなるのかは理解していない 16 #画像を描く先のXY座標 17 dstx = x 18 dsty = y 19 20 #描く画像のXY座標 21 srcx = int(x) + int(random(-CELL_SIZE, CELL_SIZE) ) 22 srcy = int(y) + int(random(-CELL_SIZE, CELL_SIZE) ) 23 24 copy( img,srcx, srcy + Y_OFFSET, 25 int(CELL_SIZE), int(CELL_SIZE), 26 dstx , dsty , 27 int(CELL_SIZE ), int(CELL_SIZE ) ) 28 29 x = x + CELL_SIZE 30 31 if (x >= width) : 32 x = 0; 33 y = y + CELL_SIZE;

def draw()〜の次の行にある、global x,yのコードを消して実行すると、以下のようなエラーが出ます。

processing.app.SketchException: UnboundLocalError: local variable 'x' referenced before assignment

at jycessing.mode.run.SketchRunner.convertPythonSketchError(Unknown Source) at jycessing.mode.run.SketchRunner.lambda$startSketch$3(Unknown Source) at java.lang.Thread.run(Thread.java:748)

変数x,yの2つだけはdraw()関数のなかでも再度globalを使用しないと、ローカル変数扱いとなってエラーが発生してしまいます。なぜこのようになるのかがわかりません。
試しに以下のコードを実行してみたときには、なんのエラーも出ずに動きました。

python

1def setup(): 2 global x,y,abc 3 x = 255 4 y = 127 5 size(600,600) 6 7def draw(): 8 d = x 9 background(d) 10 fill(y) 11 ellipse(300,300,300,300)
TN8001👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

違いは代入があるかどうかです。
2つ目のコードのdraw内のxyは値を見るだけなので、書かなくてもいいことになっています。

Python では、関数の中で参照のみされる変数は暗黙のうちにグローバルになります。関数の本体のどこかで値が変数に代入されたなら、それは明示的にグローバルであると宣言されない限り、ローカルであるとみなされます。

Python のローカルとグローバル変数のルールは何ですか? | プログラミング FAQ — Python 2.7.18 ドキュメント

投稿2021/03/18 14:46

編集2023/07/26 15:10
TN8001

総合スコア9862

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

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

doxy

2021/03/19 12:31

「Python では、関数の中で参照のみされる変数は暗黙のうちにグローバルになります。関数の本体のどこかで値が変数に代入されたなら、それは明示的にグローバルであると宣言されない限り、ローカルであるとみなされます。」(リンク先から引用) この仕様をはじめて知りました。2つ目のコードの末尾に「x += 1」と代入を追加してみたところ、local variable 'x' referenced before assignment〜のエラーが出ることも確認しました。端的な回答ありがとうございます。
guest

0

xとyがグローバル変数なのであれば、関数ごとに指定してやらないとダメです。
最初の関数でglobal したからと言ってそれは別の関数まで影響しません

これはローカル変数である!ということなんであれば、

dstx = x

dsty = y

これはこれでエラーになりますよね

投稿2021/03/18 22:06

y_waiwai

総合スコア88040

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

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

0

local variable 'x' referenced before assignment

「(def中で)xがローカル変数として参照されていますが、xが定義される前に呼び出されていますので私(Python)はどうしたらいいかわかりません」エラーです。

グローバルにxを定義するのであればdefの方が良いです。
安全な設計を目指すのであれば、
def setup(CELL_SIZE,Y_OFFSET,x,y,img):
def draw(x,y) :
のように関数の引数化する方が(定数/変数のバッティングを防げるので)もっと良いと思います。

投稿2021/03/18 14:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

TN8001

2021/03/18 14:46

Processingなので残念ながらシグネチャは変更できません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問