2012-11-04 55 views
1

我有一個關於python全局範圍的問題。更改全局範圍對象

我做這個劇本和作品,但我不知道爲什麼:

#! /bin/python3 
# -*- coding: UTF-8 -*- 

data = [] 
stats = {'white':0, } 

def main(): 
    global data 

    with open(args.finput, 'r') as f: 
     data = f.readlines() 

    rwhitespaces() 

    with open(foutput, 'w') as f: 
     for line in data: 
      f.write(line) 

    print(stats) 

def rwhitespaces(): 
    cnt = 0 
    for line in data: 
     if line == '\n': 
      data.pop(cnt) # Modifing data var without global keywork and works, why?? 
      stats['fistro'] = 1 # Modifing stats var without global keywork and works why?? 
     cnt += 1 

if __name__ == "__main__": 
    main() 

所以我誤解與全球範圍內的東西能有人解釋我嗎? 謝謝並對不起我的英文不好

回答

5

這是有效的,因爲你沒有改變引用,而是訪問一個可變對象,並讓它對自身執行更改。

global需要爲全局範圍變量(x = blah)分配一個新值,但不需要僅訪問一個。當你做data.pop(cnt)時,你所做的只是訪問變量,你可以在不使用global關鍵字的情況下做到這一點。

總之,這不是關於改變對象的屬性,它是關於一個目的是可變的分配

+0

那麼,它*是*關於改變一個變量 - 而不是一個對象的值。 – delnan

+0

@delnan爲了清晰起見,我重寫了一遍。 –