Reason for unintuitive UnboundLocalError behaviourをフォローアップします(あなたが読んだと仮定します)。 次のPythonスクリプトを考えてみましょう:直感的なUnboundLocalErrorビヘイビアの理由2
def f():
# a+=1 # 1
aa=a
aa+=1
# b+='b' # 2
bb=b
bb+='b'
c[0]+='c' # 3
c.append('c')
cc=c
cc.append('c')
d['d']=5 # Update 1
d['dd']=6 # Update 1
dd=d # Update 1
dd['ddd']=7 # Update 1
e.add('e') # Update 2
ee=e # Update 2
ee.add('e') # Update 2
a=1
b='b'
c=['c']
d={'d':4} # Update 1
e=set(['e']) # Update 2
f()
print a
print b
print c
print d # Update 1
print e # Update 2
スクリプトの結果は次のとおりです。
1
b
['cc', 'c', 'c']
{'dd': 6, 'd': 5, 'ddd': 7}
set(['e'])
コメントアウト行(1,2印)がI UnboundLocalErrorとSO質問を通じて希望線であり、参照する理由を説明します。しかし、3のマークが付いた線が動作します!
デフォルトでは、リストはPythonで参照によってコピーされるため、ccが変更されたときにcが変更されることは理解できます。しかし、なぜPythonは、メソッドのスコープからaとbを直接変更することができなければ、最初にcを変更できるようにするべきですか?
デフォルトリストがPythonでリファレンスとしてコピーされているという事実は、この設計の決定に一貫性がないのはどうかわかりません。
私は何が欠けていますか?
UPDATES:完全性については
- また、私はまた、セットを追加しましたつまり、私はソースコードを追加し、さらに完全を期すため
# Update
- で更新をマークし、上記の質問に辞書同等を追加しました同等。このセットの動作は、実際は私にとって驚くべきことです。リストや辞書に似たような行動を期待していました...
"デフォルトではリストは参照としてコピーされています。"これは誤りです。すべてが参考になります。しかし、リストは可変オブジェクトであり、整数は不変です。 Pythonがどのように実際に動作するかを反映するために用語を更新すると役に立ちます。 –
訂正のための@ S.Lott: – Jonathan