回答編集履歴
1
新しい情報を追加
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
|
+
```
|