9

私は Python 開発に比較的慣れていないので、言語のドキュメントを読んでいると、次の行に出くわしました。

囲んでいるスコープによって参照されている名前をアンバインドすることは違法です。コンパイラは SyntaxError を報告します。

そのため、学習演習で、対話型シェルでこのエラーを作成しようとしていますが、その方法を見つけることができませんでした。私はPython v2.7.3を使用しているので、次のような非ローカルキーワードを使用しています

def outer():
  a=5
  def inner():
     nonlocal a
     print(a)
     del a

はオプションではなく、nonlocalを使用しないと、Python がdel a関数inner内で参照すると、バインドされていないローカル変数として解釈し、UnboundLocalError例外をスローします。

明らかに、グローバル変数に関してこの規則には例外があります。そのため、囲んでいるスコープによって参照されている変数名を「違法に」バインド解除している状況をどのように作成できますか?

4

2 に答える 2

10

削除は外側のスコープで行う必要があります。

>>> def foo():
...     a = 5
...     def bar():
...         return a
...     del a
... 
SyntaxError: can not delete variable 'a' referenced in nested scope

コンパイル時の制限は Python 3 で削除されました。

$ python3.3
Python 3.3.0 (default, Sep 29 2012, 08:16:08) 
[GCC 4.2.1 Compatible Apple Clang 3.1 (tags/Apple/clang-318.0.58)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def foo():
...     a = 5
...     def bar():
...         return a
...     del a
...     return bar
... 
>>>

代わりに、NameErrorを参照しようとすると a が送出されますa

>>> foo()()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in bar
NameError: free variable 'a' referenced before assignment in enclosing scope

ここにドキュメントのバグを報告したくなります。Python 2 の場合、ドキュメントは誤解を招きます。コンパイル時エラーをトリガーするネストされたスコープで使用される変数を削除していますが、Python 3 ではエラーはまったく発生しません。

于 2013-03-11T15:36:49.893 に答える
5

そのエラーをトリガーするには、外側のスコープのコンテキストで変数のバインドを解除する必要があります。

>>> def outer():
...  a=5
...  del a
...  def inner():  
...   print a
... 
SyntaxError: can not delete variable 'a' referenced in nested scope
于 2013-03-11T15:37:26.427 に答える