どのようにPythonでリストのような変更可能なオブジェクトのための変数(ローカル、グローバルとローカル以外の)仕事の範囲?

クリシュナ:

私は、変数のPythonの範囲についての私の知識をテストするために以下のようなプログラムを書いています

def show(a,b):
    def add():
        a = a+b #Error at this line "UnboundLocalError: local variable 'a' referenced before assignment" 
#I know we can use nonlocal a,b to avoid error 
    add()
    print("a=",a)
x=4
y=2
show(x,y)

それから私は、リストとして、xとyとのいくつかの小さな変更で同じプログラムを試してみました。コードは以下の通りです

def show(a,b):
    def add():
        a[0] = a[0]+b[0] #No Error at this line
    add()
    print("a=",a[0])

x=[4]
y=[2]
show(x,y)

そして、このコードは、罰金を実行します。私はPythonで、この奇妙な動作を得ていないのです。

ForceBru:

スコープ規則は、すべての変数で同じです。彼らが参照するオブジェクトがどのような問題ではありません。

しかし、a = a + bそしてa[0] = a[0] + b[0]異なるものです。

  1. 最初のものは、割り当て実際にグローバル変数にローカルとして扱わパイソンによる。詳細は、この記事で見つけることができます:Pythonはグローバル変数を機能しますか?

  2. もう一つはシンタックスシュガーであるとされません割り当てを行います!への呼び出しに(内部で翻訳)脱糖います__setitem__

    a.__setitem__(0, a[0] + b[0])
    

    あなたが見ることができるように、ここには割り当て、ポイント(1)上記、適用されませんここでは問題なくそうしません。

一般的に、のようなコードがa[i] = bに変換されa.__setitem__(i, b)、および他のいくつかの構文は、関数呼び出しに変換されるだけでなく、のようにa + bすることができa.__add__(b)a[0]あるa.__getitem__(0)というように。

だから、a[0] = a[0] + b[0]この怪物になってしまうでしょう。

a.__setitem__(0, a.__getitem__(0).__add__(b.__getitem__(0)))

割り当てなし - グローバル変数に問題は突然ローカルになっていません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=21523&siteId=1