1. ホーム
  2. python

[解決済み] Pythonのネストされた関数の変数のスコープ [重複] [重複

2022-05-30 20:15:34

質問

私はこのトピックに関する他の質問をほとんどすべて読みましたが、私のコードはまだ動作しません。

私はpythonの変数スコープについて何かを見逃していると思います。

以下は私のコードです。

PRICE_RANGES = {
                64:(25, 0.35),
                32:(13, 0.40),
                16:(7, 0.45),
                8:(4, 0.5)
                }

def get_order_total(quantity):
    global PRICE_RANGES
    _total = 0
    _i = PRICE_RANGES.iterkeys()
    def recurse(_i):
        try:
            key = _i.next()
            if quantity % key != quantity:
                _total += PRICE_RANGES[key][0]
            return recurse(_i) 
        except StopIteration:
            return (key, quantity % key)

    res = recurse(_i)

そして、私は

"グローバル名 '_total' は定義されていません"

問題があるのは _total の割り当てにあることは分かっていますが、なぜなのかが分かりません。 本来なら recurse() は親関数の変数にアクセスできるはずではありませんか?

pythonの変数スコープについて、私が何を見逃しているのか、誰か説明してくれませんか?

どのように解決するのですか?

あなたのコードを実行すると、このエラーが発生します。

UnboundLocalError: local variable '_total' referenced before assignment

この問題は、この行が原因です。

_total += PRICE_RANGES[key][0]

スコープと名前空間に関する文書 にはこのように書かれています。

Pythonの特別な癖として、もし global ステートメントが有効でない場合 - の代入は常に最も内側のスコープに入ることです。 . 代入はデータをコピーしません - 名前とオブジェクトを結びつけるだけです。

ということで、この行は事実上言っているので

_total = _total + PRICE_RANGES[key][0]

を作成します。 _total の名前空間に recurse() . ということは _total は新しいものであり、割り当てられていないので、追加で使用することはできません。