Trong không làm việc đoạn , bạn chỉ định cho a
khi bạn nói "a -= 1
". Do đó, bên trong function2
, a
là địa phương trong phạm vi đó, không được lấy phạm vi bao quanh. Đóng cửa của Python là từ vựng - nó không tự động tìm kiếm a
trong khung của function2
và nếu nó chưa được gán đi và tìm nó trong khung của function1
.
Lưu ý rằng điều này không phụ thuộc vào sự đệ quy hoặc sử dụng bao đóng. Hãy xem xét ví dụ về chức năng này
def foo():
print a
a = 4
Gọi điện thoại cũng sẽ giúp bạn một số UnboundLocalError
. (Nếu không có a = 4
, nó sẽ sử dụng toàn cầu a
hoặc nếu không có, hãy tăng NameError
.) Vì a
có khả năng được chỉ định trong phạm vi đó, đó là địa phương.
Nếu tôi được thiết kế chức năng này, tôi có thể sử dụng một cách tiếp cận giống như
def function1():
a = 10
def function2(a=a):
print a
a -= 1
if a > 0:
function2(a)
function2()
(hoặc tất nhiên for a in xrange(10, -1, -1): print a
;-))
Nguồn
2010-03-25 15:23:43
Thật vậy, đây là điểm then chốt trong việc thiết kế chức năng này — bạn không thể gán cho phạm vi không phải địa phương. (Lưu ý: 'al' là * có thể thay đổi *; đó là lý do tại sao nó hoạt động.) –
Tôi nghĩ điều quan trọng là vì sự rõ ràng, để phân biệt giữa biến al và các giá trị al chứa. Nó luôn luôn trở lại với con trỏ cho tôi vì vậy hãy để tôi nói điều này; bạn không thể làm cho al điểm đến một danh sách mới nhưng bạn có thể thay đổi nội dung của danh sách mà al trỏ đến. al -> [v1, v2, v3] al không thể thay đổi nhưng v1, v2 và v3 có thể thay đổi. Mike là hoàn toàn chính xác rằng điều này làm cho al mutable bởi vì trong thuật ngữ của chúng tôi al * là * danh sách không phải là con trỏ vào danh sách. – charlieb
+1 câu trả lời rất hay. –