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

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

ただいまの
回答率

90.33%

  • Python

    9213questions

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

Global local変数

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 348

haspasedow

score -24

お世話になります。
グローバル変数とローカル変数の使い方がわかりません。
基本私1人のソースなのでグローバル変数で全て定義したいです。

関数を作成する際に引数を指定しなくてもグローバル変数で指定すればわかりやすく良いのではないでしょうか。

他人にみせません。ローカル変数とグローバル変数がダブりとんでもないことになってます。このさいグローバル変数だけで対応しようと思いますが、ふあんです。覚えるならば今日と思いましたが、どうもわざわz引数やローカル変数をつかいわけることができません。私が未熟なのだと思いますが、後に全てかきかえることになるから絶対にやめたほうがいいのであれば大変お手数ですが理由をおしえてください。

また例えば99999を格納したlocalをabcそれぞれの関数で使いたい時は全ての関数にglobal宣言が必要なのでしょうか?下のように最初に宣言すれば全ての関数で利用できる方法はありませんか?

def a()
 Local = 0
def b()
  Local = 1
def c()
  Local = 2

Global Local = 999999
a()
B()
C()
gStr = 'Global'

# ローカル変数を返す。gStrは書き変わらない。
def printLocalStr(*args):
    gStr = 'Local' # gStrはローカル変数として宣言
    return gStr

# グローバル変数の中身を書き換える
def printGlobalStr(*args):
    global gStr
    gStr = 'OverrideGlobal'
    return gStr

# 結果を出力
print printLocalStr()   # // Result: Local //
print gStr              # // Result: Global //
print printGlobalStr()  # // Result: OverrideGlobal //
print gStr               # // Result: OverrideGlobal //

参考
http://rigglog.sakura.ne.jp/db/2015/11/25/%E3%80%90python%E3%80%91%E4%BB%8A%E6%9B%B4%E3%81%A0%E3%81%91%E3%81%A9global%E3%81%A8local%E5%A4%89%E6%95%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

やめておいた方が良いですね。

ちょっと変数の名前を変えようと思っただけで、えらい騒ぎになるというのが一番わかりやすい弊害です。ソースまるごと置換すれば良いって? 往々にして関数名とかの識別子とカブって、それはそれで騒ぎになります。

別の変数に対して似たような処理をしたくなったとか、そういうとき打つ手がなくなるのも弊害の一つです。というか、そういうとき便利に使えるように関数というものがある訳ですから。

ぐちゃぐちゃになっちゃうのは、関数の設計が悪いからです。あるいは、変数の保持の仕方が悪いとか、そういうのかもしれない。いずれにせよ、globalを貼り付けて回る前にちゃんとリファクタリングしてみるべきでしょう。


ちなみに、共有する情報が多い関数群はまとめてクラスにしてしまうのも手です。インスタンス変数はオブジェクト内でだけ使えるグローバル変数みたいなものですから、うまく設計すればぐちゃぐちゃにしないで、効率よく書けます。
質問者様の過去の質問のコードを見ていると、それ以前の話のような気がしますが・・・。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

変数のスコープはできるだけ小さくとどめるべきです。
理由はこのあたりが一番大きいです。
リーダブルコードまとめ#9章

3か月後の自分は他人であるとプログラミングの世界ではよく言われます。
今は毎日ソースコードに触れているので大丈夫かもしれませんが、
一度作ってしまえば変更がない限り触れることがなくなるので、
変数の定義や変数を書き換える場所等はさっぱり忘れてしまいます。

そしていざ変更しようと思ったときに、
変数のスコープが長いとあっちで使われこっちで使われ、そっちで変更され、
ソースコードを行ったり来たりなんてことになって
どこをどう変更したらいいのか、どこに不具合が出たのかを特定するのが困難になります。

結果、修正に膨大な時間がかかって、あとで大変困ることになったり。

他人に引き継ぐプロジェクトでやってしまったら後の人にはたまったものではないですが、
尻ぬぐいをするのが自分だけというのであれば、後は

  • 上記の予想されるコストに目をつぶって開発速度を優先するか、
  • 後で大変なことにならないように今しっかりと学習コストをかけて予防するか

を選択することになりそうです。
そこはterak31さんが何を最も重視するのかによって変わってくるかと思います。

個人的には(素人目線ですが)仮想通貨は浮き沈みが激しい分野であり、
まだプラットフォーム側も試行錯誤の段階ではないかと思うので、
できそうなところだけでもローカル変数を使うようにして
なるべく修正の少ない、変更に強いコードを書くように心がけたほうがよさそうな感じがします。

また例えば99999を格納したlocalをabcそれぞれの関数で使いたい時は全ての関数にglobal宣言が必要なのでしょうか?下のように最初に宣言すれば全ての関数で利用できる方法はありませんか?

グローバル変数にLocalなんて名前を付けるのは混乱の元でしかないです
というのは置いといて、
自分でやってみたほうが早いですし、理解につながると思いますよ。

それこそ引数で渡してあげればいいと思いますが・・・・
あまりお勧めしません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    9213questions

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