回答編集履歴

1

新しい情報を追加

2018/03/27 03:47

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -17,3 +17,67 @@
17
17
  ```
18
18
 
19
19
  こっちは通りました。ということはきっと、リスト内包がローカルスコープを見ようとしてコケてるのでしょう。えーっと、なんでだろう?
20
+
21
+
22
+
23
+ ### 追記:
24
+
25
+ 同じ話題を見つけました。
26
+
27
+ [python - Accessing class variables from a list comprehension in the class definition - Stack Overflow](https://stackoverflow.com/questions/13905741/accessing-class-variables-from-a-list-comprehension-in-the-class-definition)
28
+
29
+ クラススコープの扱いが特殊で、スコープがネストされたとき内側からクラス内は見ないよ、とかなんとか・・・そしてリスト内包は関数スコープと等価のスコープなので、アウトになるっぽいです。
30
+
31
+
32
+
33
+  見るからにダメな例。
34
+
35
+ ```python
36
+
37
+ >>> class Hoge:
38
+
39
+ ... x = 3
40
+
41
+ ... def fuga(self):
42
+
43
+ ... print(x)
44
+
45
+ ...
46
+
47
+ >>> h = Hoge()
48
+
49
+ >>> h.fuga()
50
+
51
+ NameError: name 'x' is not defined
52
+
53
+ ```
54
+
55
+ これと同じ扱いになるということか。かといってリスト内包で使う場合、Hogeの定義が終わってないので、Hoge.xとも書けません。リンク先ではlambdaで解決しろといった提案がされています。
56
+
57
+ ```python
58
+
59
+ >>> class class_demo: # 方法1
60
+
61
+ ... x = 6
62
+
63
+ ... y = (lambda x:[x for i in range(5)])(x)
64
+
65
+ ... print(y)
66
+
67
+ ...
68
+
69
+ [6, 6, 6, 6, 6]
70
+
71
+ >>> class class_demo: # 方法2
72
+
73
+ ... x = 6
74
+
75
+ ... y = (lambda x=x:[x for i in range(5)])()
76
+
77
+ ... print(y)
78
+
79
+ ...
80
+
81
+ [6, 6, 6, 6, 6]
82
+
83
+ ```