2012-12-10 35 views

Trả lời

10

Bạn đang chuyển nhượng cho một biến toàn cầu, có nghĩa là bạn cần phải dấu nó như là một toàn cầu:

def somefunction(): 
    global url_request 
    url_request+=1 

Khi bạn gán cho một biến trong một phạm vi địa phương, nó được giả định là một địa phương thay đổi trừ khi bạn sử dụng câu lệnh global để báo cho trăn trước.

+0

Không bao giờ biết điều đó. Cảm ơn rất nhiều. – user1561108

+0

Thậm chí không suy nghĩ một giây rằng '+ =' đang thực hiện một nhiệm vụ. –

4

Đối với Python 2.7, chúng tôi có các loại biến: global, local. Mỗi hàm tạo ra phạm vi cục bộ của riêng nó cho các biến.

Từ phạm vi địa phương, bạn có thể đọc mà không có bất kỳ hạn chế nào. Bạn cũng có thể gọi các phương pháp đối tượng chung, để bạn có thể sửa đổi biến từ toàn cầu. Nhưng bạn không thể gán lại giá trị.

Nhìn vào mã này:

requests = [1,2,3] 

def modify(): 
    requests.append(4) 

def redeclare(): 
    requests = [10,20,30] 

modify() 
print requests 
# will give you [1,2,3,4] 

redeclare() 
print requests 
# will give you [1,2,3,4] 

gì đang xảy ra? Bạn không thể gán lại requests biến từ phạm vi địa phương, do đó, thông dịch viên sẽ tạo cho bạn khác biến - trong phạm vi địa phương cho redeclare ngữ cảnh cuộc gọi.

Về mã của bạn ... Thứ nhất, bạn cố gắng gán lại biến từ phạm vi toàn cầu. Tại sao? url_requestint, int là không thay đổi, do đó hoạt động url_request+=1 không thay đổi giá trị, nó sẽ gán lại giá trị mới cho tên biến. Thứ hai, bạn không chỉ định global xác định cho biến này. Vì vậy, chỉ có một tùy chọn cho thông dịch viên - giả sử url_request làm biến cục bộ. Nhưng ... Bạn không khai báo giá trị của nó ở bất kỳ đâu ....

UnboundLocalError có nghĩa là bạn cố gắng thực hiện các phép toán có giá trị thay đổi mà không cần khai báo trước đó. Hy vọng điều này sẽ giúp bạn hiểu thêm về các biến/tên/phạm vi Python.

Các vấn đề liên quan