1

リスト内包表記が変数のスコープを制限するべきではありません。

user = <user1>
project.users = [<user1>, <user2>, <user3>, <user4>]
project_usernames  = [user.username for user in project.users]

project.users のリスト内包表記を使用して、project_usernames リストを生成しています。しかし、<user4>以前のユーザーを変更しています<user1>

プロジェクトの 1 つで上記のフローを使用していますが、このバグのために機能していませんでした。

後で、リスト内包表記で変数「user」を変更すると、正しく機能しました。

内のエンティティが<>参照する<object>

インタープリターが行ごとに機能することは知っていますが、反復が終了すると、リスト内包表記で使用される変数のスコープが死ぬべきではありませんか?

4

1 に答える 1

1

これはPython2.xの「機能」であり、リスト内包内で使用する変数(あなたの場合user)は周囲のスコープの一部になります(Python 3では、ジェネレーターのように扱われます-内訳についてはこちらをご覧くださいGuido自身から)。リストを繰り返し処理していると仮定すると(すべてをメモリで使用可能にする必要があるのではなく)、角かっこを括弧に変更するだけで、ジェネレータのように設定できます。

>>> user = 'test'
>>> l = ['user1', 'user2', 'user3']
>>> users = (user[4] for user in l)
>>> users
<generator object <genexpr> at 0x7f6a89507140>
>>> user
'test'
>>> for num in users:
...   print num
...
1
2
3
于 2012-10-12T01:01:49.933 に答える