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

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

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

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python

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

Q&A

解決済

2回答

2419閲覧

定義したはずの変数が使えない

takanaaaa

総合スコア9

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python

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

0グッド

0クリップ

投稿2020/04/04 12:31

編集2020/04/04 14:54

定義したはずなのにエラーがでる

Using variable 'dice1' before assignmentとエラーがでます。
エラーの意味は理解できるのですが、自分としてはちゃんと定義できているつもりなのでなぜエラーが出るのかわかりません。

Python

1import discord 2import random 3import re 4 5dice1=0 6dice2=10 7 8# 自分のBotのアクセストークンに置き換えてください 9TOKEN = 'アクセストークン' 10 11# 接続に必要なオブジェクトを生成 12client = discord.Client() 13 14# 起動時に動作する処理 15@client.event 16async def on_ready(): 17 channel=client.get_channel(チャンネル) 18 await channel.send('ログインしました') 19 20# メッセージ受信時に動作する処理 21@client.event 22async def on_message(message): 23 if message.content =='/dice': 24 await message.channel.send(random.randint(dice1,dice2)) 25 26 if message.content=='/make_dice': 27 await message.channel.send('_highest[任意の数字]か_lowest[任意の数字]をつけて') 28 29 if 'make_dice_highest' in message.content: 30 dice2=re.findall('[0-9]+',message.content) 31 32 if 'make_dice_lowest' in message.content: 33 dice1=re.findall('[0-9]+',message.content) 34 35# Botの起動とDiscordサーバーへの接続 36client.run(TOKEN)

async def on_message(message)の処理の中で定義するとエラーは出なくなるのですが、それ以外の方法はないのでしょうか?
また、なぜ上のコードではエラーが出るのかも教えていただきたいです。

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

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

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

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

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

otn

2020/04/04 13:18

これが全文ですか? 省略しているのでは?
takanaaaa

2020/04/04 14:51

すみません...勝手にコードを省略しておりました....。
hayataka2049

2020/04/04 14:56

エラーメッセージも省略せず全文のほうがいいです。tracebackが出ているはずなので。
takanaaaa

2020/04/04 15:03

独断で問題をいろいろとこじらせてしまい、本当にすみませんでした...。次からは勝手に省略などはしないようにします。
otn

2020/04/04 15:07

> すみません...勝手にコードを省略しておりました....。 やはり。 回答が付いている通りです。
guest

回答2

0

ベストアンサー

これが全文ではなく、on_messageの中のどこかでdice1などに対して代入を行っている場合、これはローカル変数とみなされます。

Pythonでは、代入によって変数の属するスコープが静的に決まります。詳しくは以下のリファレンスのFAQを参照してください。

これは、あるスコープの中で変数に代入を行うとき、その変数はそのスコープに対してローカルになり、外のスコープにある同じ名前の変数を隠すからです。foo の最後の文が x に新しい値を代入しているので、コンパイラはこれをローカル変数であると認識します。

なぜ変数に値があるのに UnboundLocalError が出るのですか? | プログラミング FAQ — Python 3.8.2 ドキュメント

このケースでは明示的にglobal宣言を行えば問題は解消するかと思います(グローバル変数として扱って良いのであれば)。

投稿2020/04/04 13:50

hayataka2049

総合スコア30935

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

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

takanaaaa

2020/04/04 15:05

まさにhayatakaさんのおっしゃる通りで、勝手に省略していた部分で代入を行っていました。わざわざサイトのリンクまで貼ってって下さりありがとうございます。
guest

0

エラーを再現できません。
そのコードで問題なく動作します。
dice1とかが実はグローバルじゃなくて関数内やクラス内で宣言してたとかじゃないですか?

python

1client = discord.Client() 2 3dice1 = 0 4dice2 = 10 5 6@client.event 7async def on_message(message): 8 if message.author.bot: 9 return 10 if message.content == '/dice': 11 await message.channel.send(random.randint(dice1, dice2)) 12 13client.run(TOKEN)

イメージ説明

投稿2020/04/04 13:12

kairi003

総合スコア1332

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

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

takanaaaa

2020/04/04 14:57

自分がコードを勝手に省略しておりました...。本当にすみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問