ホームページ  >  記事  >  バックエンド開発  >  Python の global ステートメントでのグローバル変数の値の変更

Python の global ステートメントでのグローバル変数の値の変更

高洛峰
高洛峰オリジナル
2017-03-02 11:13:351782ブラウズ

Python のグローバル変数: int string、list、dic(map) global が存在する場合、その値を変更できます。 if にグローバルが存在するかどうか、または if が実行できるかどうかは関係ありません。

ただし、

if bGlobal: 
    global g_strVal;

int 文字列がない場合は、エラーが報告されます。 list dic(map) もOKです。

#!/usr/bin/dev python 
 
import sys 
import os 
 
g_nVal = 0; 
g_strVal = "aaaa"; 
 
g_map = { 
"aaa" : "111", 
"bbb" : "222", 
"ccc" : "333", 
"ddd" : "444" 
} 
 
g_ls = ['a', 'b', 'c'] 
 
def FixInt(bGlobal = False): 
  if bGlobal: 
    global g_nVal;   
     
  g_nVal = g_nVal + 1; 
   
def FixString(bGlobal = False): 
  if bGlobal: 
    global g_strVal; 
   
  #fix string value 
  g_strVal = g_strVal + 'b'; 
 
def FixMap(bGlobal = False): 
  if bGlobal: 
    global g_map; 
   
  #fix map value   
  g_map['aaa'] = 'aaa__' + g_strVal; 
  g_map['bbb'] = 'bbb__' + g_strVal; 
  g_map['ccc'] = 'ccc__' + g_strVal; 
  g_map['ddd'] = 'ddd__' + g_strVal; 
   
def FixList(bGlobal = False): 
  if bGlobal: 
    global g_ls; 
     
  g_ls.append('1');     
   
def PrintVal(strInfo): 
  if strInfo: 
    print("==== %s =====" %strInfo); 
     
  print("int value:%d" %g_nVal); 
  print("string value:%s" %g_strVal); 
  print("map value:%s" %g_map); 
  print("list value:%s" %g_ls); 
  print("\n\n");   
 
if "__main__" == __name__: 
   
  PrintVal("The orgin vlaue"); 
   
  FixInt(); 
  FixString(); 
  FixMap(); 
  FixList(); 
   
  PrintVal("print all bGlobal = False vlaue"); 
   
  FixInt(True); 
  FixString(True); 
  FixMap(True); 
  FixList(True); 
   
  PrintVal("print all bGlobal = True vlaue");

Result:

==== The orgin vlaue =====
int value:0
string value:aaaa
map value:{'aaa': '111', 'bbb': '222', 'ccc': '333', 'ddd': '444'}
list value:['a', 'b', 'c']

g_nVal src:0
g_nVal dst:1
==== print all bGlobal = False value =====
int value:1
string value:aaaab
map value:{'aaa': 'aaa__aaaab', 'bbb': 'bbb__aaaab', 'ccc': 'ccc__aaaab', 'ddd': 'ddd__aaaab'}
list value:['a', 'b', 'c', '1']

g_nVal src:1
g_nVal dst:2
==== print all bGlobal = True value =====
int value:2
string value:aaaabb
map value:{'aaa': 'aaa__aaaabb', 'bbb': 'bbb__aaaabb', 'ccc': 'ccc__aaaabb', 'ddd': 'ddd__aaaabb'}
list value:['a', 'b', 'c', '1', '1']

グローバル辞書変数を変更するには、globalキーワードを使用してみてはいかがでしょうか
たとえば、次のコードです

​​

s = 'foo' 
d = {'a':1} 
def f(): 
  s = 'bar' 
  d['b'] = 2 
f() 
print s 
print d

変更する辞書の値 d グローバルを使用する必要はありません キーワードを最初に宣言する必要がありますか?
これは、
文 s = 'bar' では、グローバル変数 s を参照するか、新しいローカル変数を作成することができるため、「曖昧」です。そのため、Python では、デフォルトで、その動作はローカル変数を作成することです。グローバルが明示的に宣言されていない限り、d['b']=2 という文では、d がローカル変数とみなされると KeyError が報告されるため、グローバル d のみを参照できるため、これは「明示的」です。したがって、明示的にグローバルを宣言する必要はありません。
上記の 2 つの代入ステートメントは実際には異なる動作であり、1 つは再バインディング、もう 1 つは突然変異です。

しかし、このような場合

d = {'a':1} 
def f(): 
  d = {} 
  d['b'] = 2 
f() 
print d

文 d = {} では、それは「曖昧」です。したがって、グローバル変数 d を参照する代わりにローカル変数 d を作成するため、 d['b']=2 も操作のローカル変数になります。

ひいては、これらすべての現象の本質は「それが明らかかどうか」です。

注意深く考えてみると、dict にグローバルが必要ないだけでなく、すべての「明示的な」ものにもグローバルが必要ないことがわかります。 int 型と str 型は変更方法が x = y の 1 つしかないため、この変更方法も変数の作成方法なので曖昧さが生じ、変更するのか作成するのかわかりません。 dict/list/objects などについては、dict['x']=y または list.append() を使用して変更できます。変数の作成と競合せず、曖昧さも生じないため、変更する必要はありません。明示的にグローバルです。


Python の global ステートメントでのグローバル変数の値の変更に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。