リスト内包表記を使用して、Python2.7 のクラス属性に値を割り当てています。これにより、リスト内包表記で使用される変数がクラス属性として追加されることに気付きました。
class MyClass:
some_strings = [s for s in ('Foo','Bar')]
print MyClass.s
Output: 'Bar' #??
誰かがなぜこれが起こっているのか説明できますか? そこでリスト内包表記を使用すると何か問題がありますか?
リスト内包表記を使用して、Python2.7 のクラス属性に値を割り当てています。これにより、リスト内包表記で使用される変数がクラス属性として追加されることに気付きました。
class MyClass:
some_strings = [s for s in ('Foo','Bar')]
print MyClass.s
Output: 'Bar' #??
誰かがなぜこれが起こっているのか説明できますか? そこでリスト内包表記を使用すると何か問題がありますか?
何も問題はありません。for
リスト内包表記を使用すると、ループと同様に、その変数がローカル スコープに追加されます。クラス定義内で使用される場合、前述のローカル スコープはクラス属性の初期化に使用されます。クラスに名前を付けたくない場合はdel
、名前を付ける必要があります。s
class MyClass:
some_strings = [s for s in ('Foo','Bar')]
del s
Python 3 (3.4 でテスト済み) では、リスト内包表記はその変数をローカル スコープに追加しないことに注意してください。