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

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

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

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

Q&A

解決済

1回答

2040閲覧

【Python】def関数内の辞書型変数を、別ファイルで使いたい

tako15

総合スコア11

Python

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

0グッド

0クリップ

投稿2022/01/03 06:36

前提・実現したいこと

スパムメールフィルターを作成しています。
A、Bという辞書型変数があり、Aは単語と出現頻度、Bは単語と出現率をそれぞれ表しています。(A,B自体は質問に関係ありませんが、一応説明しておきます)
sample1.pyのdef関数内にあるBを、sample2.py内で使えるようにしたいです。
どのような方法でもいいのですが、やり方はありませんか?

以前、このサイトで質問し、「def関数内の変数を外で使う場合はグローバル変数にする」ことを教えて頂きましたが、辞書型変数をグローバル変数にするとエラーが出てしまうので分からず質問しました。

発生している問題・エラーメッセージ

sample1.pyでのエラー

$ python sample2.py training.txt C = hoge.B.copy() AttributeError: 'function' object has no attribute 'B'

該当のソースコード

sample1.py

python3

1A = {} 2 3def hoge(f): 4 ~ # 色々な処理省略 5 6 # global B = {} 7 A = {"開催":1, "人気":2, "販売":3, "講義":4} 8 # key=単語 value=出現回数 9 sum_num = sum(A.values()) 10 B = A.copy() 11 12 for key in B.keys(): 13 B[key] /= sum_num # key=単語 value=出現率 14 15C = hoge.B.copy() # 分からないところ1

sample2.py

python3

1import sys 2import sample1 3 4with open(sys.argv[1], "r") as f: 5 sample1.hoge(f) 6 C = sample1.C.copy() # 分からないところ2 7 8~ # 以下省略

試したこと

sample1.pyでBをhoge関数内で global B = {}のように書いて実行しましたが、構文エラーになりました。
sample1.pyで'C = hoge.B.copy()'として、sample2.pyで'C = sample1.C.copy()'とすれば上手くいくかとやってみましたが、上手くいきませんでした。

補足情報(FW/ツールのバージョンなど)

python 3.6.12

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

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

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

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

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

guest

回答1

0

ベストアンサー

global文は次のように使います。

python

1dictionary = {} # <- s_1 2 3def func(): 4 global dictionary # <- s_2 5 dictionary = {"apple": 1} 6 7func() 8print(dictionary)

おそらくエラーになったのは、s_1の変数宣言を書いていないか、下のようにglobal文の書き方に問題があったと考えられます。

python

1def func(): 2 global B = {} # invalid syntax 3 4 global B # 正しい書き方 5 B = {}

投稿2022/01/03 06:53

wsb

総合スコア194

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

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

tako15

2022/01/03 11:09

global文の書き方が間違っていたようで、教えてもらった通りやったらうまくいきました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問