回答編集履歴
2
文章の軽微修正
answer
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
Python3 になるときに exec は構文から関数へ変更されました。それに併せて挙動が変更され
|
1
|
+
Python3 になるときに exec は構文から関数へ変更されました。それに併せて挙動が変更されたようです。※参考:[Issue 4831: exec() behavior - revisited - Python tracker](http://bugs.python.org/issue4831)
|
2
2
|
|
3
3
|
また、[公式リファレンス](https://docs.python.jp/3/library/functions.html#exec) に下記の注釈があります。
|
4
4
|
|
5
5
|
> 標準の locals 辞書に対する変更を試みてはいけません。 exec() の呼び出しが返る時にコードが locals に与える影響を知りたいなら、**明示的に locals 辞書を渡してください**。
|
6
6
|
|
7
|
-
つまり、
|
7
|
+
つまり、Python3 でも動作させるにはこんなコードになります。
|
8
8
|
|
9
9
|
```python
|
10
10
|
def main():
|
@@ -17,6 +17,8 @@
|
|
17
17
|
main()
|
18
18
|
```
|
19
19
|
|
20
|
+
なんだかゴチャゴチャしてしまいました。
|
21
|
+
|
20
22
|
---
|
21
23
|
|
22
24
|
そもそも **exec() や eval() はよほどの事がない限り使うべきではありません**。今回のように実装が複雑になったり、脆弱性の原因にもなります。特に今回のような変数名を exec/eval で決定するような方法は避けるべきです。
|
@@ -49,7 +51,7 @@
|
|
49
51
|
main()
|
50
52
|
```
|
51
53
|
|
52
|
-
さらに [defaultdict](http://docs.python.jp/3.3/library/collections.html#collections.defaultdict) を使えば
|
54
|
+
さらに [defaultdict](http://docs.python.jp/3.3/library/collections.html#collections.defaultdict) を使えばリストの定義を自動でやってくれるようになるので、すっきりしたコードになります。
|
53
55
|
|
54
56
|
```python
|
55
57
|
from collections import defaultdict
|
1
defaultdict を使った方法を追記
answer
CHANGED
@@ -19,26 +19,54 @@
|
|
19
19
|
|
20
20
|
---
|
21
21
|
|
22
|
-
そもそも **exec() や eval() はよほどの事がない限り使うべきではありません**。特に今回のような変数名を exec/eval で決定するような方法は避けるべきです。
|
22
|
+
そもそも **exec() や eval() はよほどの事がない限り使うべきではありません**。今回のように実装が複雑になったり、脆弱性の原因にもなります。特に今回のような変数名を exec/eval で決定するような方法は避けるべきです。
|
23
23
|
|
24
|
-
変数が不定・複数ある場合は
|
24
|
+
変数が不定・複数ある場合はリストや辞書を使いましょう。
|
25
25
|
|
26
26
|
```python
|
27
|
+
import fileinput
|
28
|
+
|
27
29
|
def main():
|
28
|
-
a = {}
|
29
|
-
for i in
|
30
|
+
for i in fileinput.input():
|
30
|
-
a
|
31
|
+
a = i.strip()
|
32
|
+
print('a is', a)
|
31
33
|
|
34
|
+
d = {}
|
32
|
-
|
35
|
+
for i in range(0, int(a)):
|
33
|
-
|
36
|
+
d[i] = []
|
34
|
-
a[0].append('3')
|
35
37
|
|
36
|
-
|
38
|
+
d[0].append('1')
|
37
|
-
|
39
|
+
d[0].append('2')
|
38
|
-
|
40
|
+
d[0].append('3')
|
39
41
|
|
40
|
-
|
42
|
+
d[1].append('4')
|
41
|
-
|
43
|
+
d[1].append('5')
|
44
|
+
d[1].append('6')
|
42
45
|
|
46
|
+
print(d[0])
|
47
|
+
print(d[1])
|
48
|
+
|
43
49
|
main()
|
50
|
+
```
|
51
|
+
|
52
|
+
さらに [defaultdict](http://docs.python.jp/3.3/library/collections.html#collections.defaultdict) を使えば最初の初期化を不要にできるので、すっきりしたコードになります。
|
53
|
+
|
54
|
+
```python
|
55
|
+
from collections import defaultdict
|
56
|
+
|
57
|
+
def main():
|
58
|
+
d = defaultdict(list)
|
59
|
+
|
60
|
+
d[0].append('1')
|
61
|
+
d[0].append('2')
|
62
|
+
d[0].append('3')
|
63
|
+
|
64
|
+
d[1].append('4')
|
65
|
+
d[1].append('5')
|
66
|
+
d[1].append('6')
|
67
|
+
|
68
|
+
print(d[0])
|
69
|
+
print(d[1])
|
70
|
+
|
71
|
+
main()
|
44
72
|
```
|