大家知道在python中,對一個(gè)非列表、字典的變量,對與全局變量同名的局部變量進(jìn)行修改,不會影響全局變量。如果局部變量以全局變量進(jìn)行賦值,就更加不會出現(xiàn)“修改了局部影響到全局”
A = "a"
def test():
B = A
B = "b"
print B
print A
print A
但是,如果這個(gè)變量是全局 列表,字典,元組,就有點(diǎn)復(fù)雜了
如代碼1
HEADER =["A","B"]
print HEADER[0],
def test():
t_h = HEADER
t_h[0] = "C"
print t_h[0],HEADER[0],
test()
print HEADER[0]
結(jié)果是 A C C C
發(fā)現(xiàn)兩點(diǎn)
1、在局部,不需要用global進(jìn)行顯式指明是全局變量
2、=不是一個(gè)賦值,而更像是指針指向這個(gè)全局變量
而下面這樣
代碼2
HEADER =["A","B"]
print HEADER[0],
def test():
t_h = HEADER
t_h = ["C","B"]
print t_h[0],HEADER[0],
test()
print HEADER[0]
結(jié)果是 A C A A
問題的就是是否對 局部變量進(jìn)行了顯式賦值,或者說是給了一個(gè)明確的值
在代碼1里,t_h = HEADER可以理解為把 HEADER的 內(nèi)存地址給了 t_h,所以對t_h[0]進(jìn)行操作時(shí),會影響到全局列表值。
而在代碼2里,因?yàn)檫M(jìn)行了 t_h = ["C","B"] 操作,這樣就值在內(nèi)存里又產(chǎn)生了一個(gè) 值為["C","B"]的內(nèi)存區(qū)域,t_h又指向這個(gè)區(qū)域