16

私はファイルにこのコードを持っています

class Sudoku(dict):
    COLUMNS = [
        {(x, y) for y in xrange(9)} for x in xrange(9)
    ]

を実行するpython broken.pyと、トレースバックが表示されます。

Traceback (most recent call last):
  File "U:\broken.py", line 1, in <module>
    class Sudoku(dict):
  File "U:\broken.py", line 3, in Sudoku
    {(x, y) for y in xrange(9)} for x in xrange(9)
  File "U:\broken.py", line 3, in <setcomp>
    {(x, y) for y in xrange(9)} for x in xrange(9)
NameError: global name 'x' is not defined
[Finished in 0.1s with exit code 1]

ここでは問題がわかりません。x理解で定義されていませんか?


奇妙なのは、Python インタープリターに直接貼り付けると、エラーなしで実行されるように見えることです...


編集:これは、セット内包表記ではなくリスト内包表記を使用すると機能します

4

5 に答える 5

8

ここにバグを報告しました。これはまだ壊れているPython 2.7.5の設計による。

バグレポートから:

Python 2 では、リスト内包表記には独自のスコープがないため、x最初の例の はクラス スコープにあります。ただし、集合内包表記には独自のスコープがあります。設計上、クラス スコープで定義された変数は、そのクラス内の内部スコープからは見えません。

Python 3 では、リスト内包表記に独自のスコープがあるため、これが機能します。

于 2013-05-31T23:11:38.747 に答える
3

大げさな推測ですが、Python 集合内包表記は Python 2.7 と 3.0 で導入されました。古いバージョンを使用してスクリプトを実行し、最近のバージョンをインタープリターとして使用することはありませんか?


Python ドキュメントのこのセクションを見ても、この動作についての説明はありません。さらに、リスト内包表記で動作するという事実は、スコープの問題ではないことを明確に示しています。

考えられる理由は次の 2 つだけです。

  • 集合内包表記の実装におけるバグ
  • 集合内包表記をサポートしない以前の Python バージョンの使用。
于 2012-09-04T08:33:58.227 に答える
2

コードが機能しない理由がわかりませんが、次のように機能し、必要なものが得られます。

class Sudoku(dict):
    COLUMNS = [
        set([(x, y) for y in xrange(9)]) for x in xrange(9)
    ]

おそらく、このサイトの Python 専門家の中には、コード スニペットが失敗する理由を教えてくれる人もいるでしょう。

于 2012-09-04T08:26:32.190 に答える
1

理論的な説明ができればいいのですが、これはうまくいきます:

class Sudoku(dict):
    def __init__(self):
        self.COLUMNS = [
            {(x, y) for y in xrange(9)} for x in xrange(9)
            ]

if __name__ == "__main__":
    s = Sudoku()
    print s.COLUMNS
于 2012-09-04T08:21:08.770 に答える
1

多分これはあなたが本当に欲しいものです:

[[{x:y} for x in xrange(9)] for y in xrange(9)]
于 2012-09-04T08:21:45.697 に答える