teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

文章の軽微修正

2017/07/07 04:59

投稿

miyahan
miyahan

スコア3095

answer CHANGED
@@ -1,10 +1,10 @@
1
- Python3 になるときに exec は構文から関数へ変更されました。それに併せて挙動が変更されています。※参考:[Issue 4831: exec() behavior - revisited - Python tracker](http://bugs.python.org/issue4831)
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
- つまり、むりやり Python3 で動作させるにはこんなコードになります。
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 を使った方法を追記

2017/07/07 04:58

投稿

miyahan
miyahan

スコア3095

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 range(0, 2):
30
+ for i in fileinput.input():
30
- a[i] = []
31
+ a = i.strip()
32
+ print('a is', a)
31
33
 
34
+ d = {}
32
- a[0].append('1')
35
+ for i in range(0, int(a)):
33
- a[0].append('2')
36
+ d[i] = []
34
- a[0].append('3')
35
37
 
36
- a[1].append('4')
38
+ d[0].append('1')
37
- a[1].append('5')
39
+ d[0].append('2')
38
- a[1].append('6')
40
+ d[0].append('3')
39
41
 
40
- print(a[0])
42
+ d[1].append('4')
41
- print(a[1])
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
  ```