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

回答編集履歴

2

追記

2018/09/06 09:10

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -84,4 +84,10 @@
84
84
  In global scope:
85
85
  global spam
86
86
  139676165093680
87
- ```
87
+ ```
88
+
89
+ **追記: **
90
+ よく考えたら (むしろよく考えなくても) idを見る必要は無いですね。
91
+ せっかくspamの値を切り替えているのですから...
92
+
93
+ 無意味な実験をこっそり消すのもなんとも虚しいので、残してはおきます。

1

追記

2018/09/06 09:10

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -20,4 +20,68 @@
20
20
 
21
21
  > 変数 spam がグローバル変数になったのだから、グローバル変数 spam に"global spam"を代入した
22
22
 
23
- グローバルな空間にあるspamをいくら書き換えたところで、2番のspam には影響しません。
23
+ グローバルな空間にあるspamをいくら書き換えたところで、2番のspam には影響しません。
24
+
25
+ 実験
26
+ ---
27
+ idを見てみるとなかなか面白いですね。
28
+ ```Python
29
+ def debug_print(message, obj):
30
+ print(message)
31
+ print(f'\t{obj}\n\t{id(obj)}')
32
+
33
+ def scope_test():
34
+ def do_local():
35
+ spam = "local spam"
36
+ debug_print("In do_local:", spam)
37
+
38
+ def do_nonlocal():
39
+ nonlocal spam
40
+ spam = "nonlocal spam"
41
+ debug_print("In do_nonlocal:", spam)
42
+
43
+ def do_global():
44
+ global spam
45
+ spam = "global spam"
46
+ debug_print("In do_global:", spam)
47
+
48
+ spam = "test spam"
49
+ debug_print("Before any assignment:", spam)
50
+ do_local()
51
+ debug_print("After local assignment:", spam)
52
+ do_nonlocal()
53
+ debug_print("After nonlocal assignment:", spam)
54
+ do_global()
55
+ debug_print("After global assignment:", spam)
56
+
57
+ scope_test()
58
+ debug_print("In global scope:", spam)
59
+ ```
60
+
61
+ **実行結果** [Wandbox](https://wandbox.org/permlink/HMgzVhh6wCVUg2zs)
62
+ ```plain
63
+ Before any assignment:
64
+ test spam
65
+ 139676165093808
66
+ In do_local:
67
+ local spam
68
+ 139676165093296
69
+ After local assignment:
70
+ test spam
71
+ 139676165093808
72
+ In do_nonlocal:
73
+ nonlocal spam
74
+ 139676165093488
75
+ After nonlocal assignment:
76
+ nonlocal spam
77
+ 139676165093488
78
+ In do_global:
79
+ global spam
80
+ 139676165093680
81
+ After global assignment:
82
+ nonlocal spam
83
+ 139676165093488
84
+ In global scope:
85
+ global spam
86
+ 139676165093680
87
+ ```