Ví dụ
(Xem thêm xuống cho một bản tóm tắt)
Điều này có nghĩa là nếu một biến được không bao giờ giao cho trong cơ thể của một chức năng, sau đó nó sẽ được coi như toàn cầu.
Điều này giải thích lý do tại sao các công trình sau đây (a
được coi là toàn cầu):
a = 1
def fn():
print a # This is "referencing a variable" == "reading its value"
# Prints: 1
Tuy nhiên, nếu biến được gán cho nơi nào đó trong cơ thể của chức năng, sau đó nó sẽ được coi như địa phương cho toàn bộ nội dung chức năng.
Điều này bao gồm các phát biểu được tìm thấy trước khi được gán cho (xem ví dụ bên dưới).
Điều này giải thích lý do tại sao các công việc sau đây không hoạt động. Ở đây, a
được coi là địa phương,
a = 1
def fn():
print a
a = 2 # <<< We're adding this
fn()
# Throws: UnboundLocalError: local variable 'a' referenced before assignment
Bạn có thể có Python đối xử với một biến như toàn cầu với tuyên bố global a
. Nếu bạn làm như vậy, thì biến đó sẽ được coi là toàn cục, một lần nữa cho toàn bộ phần thân hàm.
a = 1
def fn():
global a # <<< We're adding this
print a
a = 2
fn()
print a
# Prints: 1
# Then, prints: 2 (a changed in the global scope too)
Tóm tắt
Không giống như những gì bạn có thể mong đợi, Python sẽ không mùa thu trở lại phạm vi toàn cầu nếu không tìm thấy a
trong phạm vi địa phương.
Điều này có nghĩa là một biến là địa phương hoặc toàn cầu cho toàn bộ nội dung chức năng: không thể toàn cầu và sau đó trở thành cục bộ.
Bây giờ, để biết một biến được coi là cục bộ hay toàn cầu, Python tuân thủ quy tắc sau. Biến là:
- toàn cầu nếu chỉ tham chiếu và không bao giờ giao cho
- toàn cầu nếu báo cáo kết quả
global
được sử dụng
- địa phương nếu biến được gán cho ít nhất một lần (và
global
không được sử dụng)
ghi chú Hơn nữa
Trong thực tế, "implic itly toàn cầu "không thực sự có nghĩa là toàn cầu. Đây là một cách tốt hơn để suy nghĩ về nó:
- "địa phương" có nghĩa là "ở đâu đó bên trong hàm"
- "toàn cầu" thực sự có nghĩa là "ở đâu đó ngoài chức năng"
Vì vậy, nếu một biến là "ngầm toàn cầu" (== "ngoài chức năng"), sau đó nó "kèm theo phạm vi" sẽ được nhìn lên đầu tiên:
a = 25
def enclosing():
a = 2
def enclosed():
print a
enclosed()
enclosing()
# Prints 2, as supplied in the enclosing scope, instead of 25 (found in the global scope)
Bây giờ, như thường lệ, global
cho phép bạn tham khảo các sc toàn cầu ope.
a = 25
def enclosing():
a = 2
def enclosed():
global a # <<< We're adding this
print a
enclosed()
enclosing()
# Prints 25, as supplied in the global scope
Bây giờ, nếu bạn cần thiết để gán cho a
trong enclosed
, và muốn a
's giá trị được thay đổi trong enclosing
' phạm vi s, nhưng không phải trong phạm vi toàn cầu, sau đó bạn sẽ cần nonlocal
, đó là mới trong Python 3. Trong Python 2, bạn không thể.
Thiếu phân bổ: [Học Python: Lập trình hướng đối tượng mạnh mẽ] (http://goo.gl/woLW0F) –
@A श wini च haudhary Xong :) – ajkumar25