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

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

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

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

Q&A

2回答

1790閲覧

Global local変数

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2018/06/04 15:11

編集2018/06/04 15:28

お世話になります。
グローバル変数とローカル変数の使い方がわかりません。
基本私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/

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

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

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

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

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

guest

回答2

0

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

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

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

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

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

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

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

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

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

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

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

投稿2018/06/04 17:05

ponpu1601

総合スコア166

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

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

0

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

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

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

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


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

投稿2018/06/04 16:06

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問