2012-03-30 5 views
6

Tôi có một biến toàn cục mà tôi đang sử dụng làm biến mặc định. Tùy thuộc vào những gì xảy ra trong chương trình của tôi, tôi cần có khả năng thay đổi các giá trị mặc định đó và có các thay đổi tồn tại thông qua hoạt động còn lại của mã của tôi. Tôi muốn họ thay đổi và định nghĩa ở khắp mọi nơi vì thế tôi đã sử dụng một biến toàn cục. Dưới đây là một số mã thử nghiệm cho thấy cách tôi đang cố gắng sửa đổi các biến này.Biến toàn cầu bị nhầm lẫn trong python

Khi tôi làm điều này tôi có những vấn đề sau đây ... chương trình

  1. Các nghĩ rằng myGlobal chưa được quy định tại chính. Nhưng nó có. Tại sao?
  2. Khi tôi gọi một chương trình con sau khi tôi đã thay đổi myGlobal. Tôi không muốn điều đó xảy ra.

Cách thích hợp để hoàn thành những gì tôi đang cố gắng làm ở đây là gì? Ví dụ?

#!/usr/bin/python 

import sys 

myGlobal = "foo" 

print "********************" 
print "MyGlobal %s" % myGlobal 
print "********************" 


def main(argv): 

    #UnboundLocalError: local variable 'myGlobal' referenced before assignment 
    print '1. Printing the global again: ' + myGlobal 

    myGlobal = "bar" 
    print "2. Change the global and print again: " + myGlobal 

    # now call a subroutine 
    mySub() 

# Checks for output file, if it doesn't exist creates one 
def mySub(): 
    # Why isn't the global "bar" not "foo"? 
    print '3. Printing the global again: ' + myGlobal 

    myGlobal = "black sheep" 
    print "4. Change the global and print again: " + myGlobal 




if __name__ == "__main__": 
    main(sys.argv[1:]) 

Trả lời

8

Nếu bạn muốn gán để, chứ không phải là đọc một biến mô-đun-toàn cầu từ bên trong một hàm, bạn cần global keyword:

def main(argv): 
    global myGlobal 
    #... 
    myGlobal = "bar" 

Nếu việc chuyển nhượng sẽ chỉ tạo ra một mới biến cục bộ làm đổ bóng biến toàn cầu của bạn (do đó, các thay đổi đối với biến đó sẽ không ảnh hưởng đến biến toàn cục, như trường hợp trong ví dụ của bạn).

Điều đó nói rằng, bạn cũng có thể sử dụng một lớp vào đây để có trạng thái phần chức năng của bạn trong một cách đẹp hơn:

class MyApp(object): 
    def main(self, argv): 
    self.myVar = "bar" 
    self.mySub() 

    def mySub(self): 
    print self.myVar 

MyApp().main(sys.argv[1:]) 
2

gì bạn đang tìm kiếm là global statement trong python. Chèn global myGlobal trước mã hóa của bạn trong mainmySub và ở đó bạn có hành vi có thể dự đoán được. Có nói rằng, nếu bạn phải vượt qua thông tin trạng thái giữa các hàm, sử dụng các đối số cho hàm. Đó là nhiều neater.