Làm cách nào để bạn truy cập biến từ phạm vi bên ngoài trong python?
Gần đây tôi đã xây dựng bản beta của Python 3000 – bản cải tiến hoàn toàn sắp tới của Python (sẽ được phát hành vào tháng 9 – 992 năm trước khi họ hứa. ) Bởi vì Py3K “không tương thích ngược” một cách đáng xấu hổ, nên cuối cùng họ cũng sửa tất cả các lỗi ngôn ngữ chính và biến mọi thứ thành “theo cách chúng nên hoạt động. ” (Lưu ý sẽ có quá trình chuyển đổi hơi tự động từ mã Python 2 sang 3) Show Và tôi yêu nó. Tất cả mọi thứ được cố định theo cách tôi hy vọng. Do đó, đây là bài đầu tiên trong loạt bài đăng trên blog “Py3K rox my sox”. Bạn có thể xem tóm tắt các tính năng mới tại đây OK, vì vậy một trong những vấn đề chính mà tôi đã phàn nàn (và đã nghe) trong Python là vấn đề được gọi là "phạm vi bên ngoài". Đây là một hạn chế rất rõ ràng về những gì bạn có thể làm trong Python. đọc tiếp Toàn cầu thực sự hoạt động như thế nàoĐầu tiên là một chút thông tin cơ bản có thể bạn chưa biết. Điều này áp dụng cho tất cả các phiên bản Python, không chỉ 3. 0 Trong Python nếu bạn không khai báo một biến, Python sẽ xác định xem bạn đang đề cập đến một biến cục bộ hay toàn cầu dựa trên việc bạn viết cho biến đó. Ví dụ x = 4 def f(): return x Ở đây, Python chỉ ra rằng x mà bạn đề cập thực sự là x toàn cầu và trả về 4. Nó tìm ra điều này bởi vì hàm không bao giờ ghi vào x, ở bất cứ đâu. Không chỉ bởi vì nó chưa được ghi vào x, mà bởi vì nó không có câu lệnh gán cho x. (Nó tìm ra điều này một cách tĩnh, không phải trong thời gian chạy). Ví dụ x = 4 def f(): if True: return x else: x = 2 Đây sẽ là một câu hỏi đố gọn gàng thực sự. f() đánh giá cái gì? Câu trả lời. UnboundLocalError. biến cục bộ 'x' được tham chiếu trước khi gán Thực tế là x được gán ở đâu đó trong hàm (thậm chí ở đâu đó sẽ không bao giờ được thực thi) khiến Python coi nó là cục bộ và do đó, nó không được xác định khi bạn trả lại nó Giải pháp chính xác là khai báo nó một cách rõ ràng "toàn cầu", đây là cách duy nhất để tạo một hàm ghi vào một x = 4 def f(): global x if True: return x else: x = 2 Điều này hoạt động tốt trong thực tế, bởi vì bạn có thể xác định các hằng số như MAX_FOO và sử dụng chúng ở mọi nơi mà không cần khai báo chúng trên toàn cầu, nhưng bạn cần phải rõ ràng nếu bạn muốn cập nhật một toàn cầu (thường là một ý tưởng hay vì nó nguy hiểm – xem Vấn đề “phạm vi bên ngoài”Về vấn đề “phạm vi bên ngoài”. Về cơ bản, Python cho phép bạn viết các hàm lồng nhau và các hàm lồng nhau có quyền truy cập vào các biến cục bộ của mã chứa chúng. Ví dụ def outer(): x = 9 def inner_read(): return x return inner_read() Nếu bạn gọi bên ngoài (), nó sẽ trả về 9. Biến x là cục bộ của hàm bên ngoài. Nhưng chức năng bên trong có thể đọc nó và trả lại Vấn đề xảy ra khi bạn muốn ghi vào một biến không cục bộ, như thế này def outer(): x = 9 def inner_read(): return x def inner_write(): x = 3 inner_write() return inner_read() Cũng giống như các biến toàn cục, Python có thể tìm thấy các biến phạm vi bên ngoài nếu bạn chỉ đọc chúng (như inner_read đã làm), nhưng nếu bạn viết chúng ở bất kỳ đâu trong hàm, nó sẽ giả định rằng bạn đang tạo một biến cục bộ mới (như inner_write đã làm). Do đó, inner_write tạo một x cục bộ mới và gán cho nó 3, và hàm outside trả về 9. Tôi muốn Internal_write cập nhật x hiện có và do đó có trả về bên ngoài 3 Giải pháp khá đơn giản. Có một từ khóa như toàn cầu, nhưng thay vì đi đến phạm vi trên cùng, nó chỉ yêu cầu Python tìm kiếm phạm vi trong cùng với một biến ràng buộc có tên đó Trăn 3. 0 giới thiệu chính xác đó. từ khóa nonlocal. Thử một lần đi def outer(): x = 9 def inner_read(): return x def inner_write(): nonlocal x x = 3 inner_write() return inner_read() tiếng kêu. Trăn 3. 0 biên dịch mã này và hàm bên ngoài trả về 3 Điều buồn cười là, vấn đề này dường như chỉ xảy ra với Python. Trong hầu hết các ngôn ngữ tĩnh, tất cả các biến được khai báo. Trong Haskell, tất cả các biến đều ở dạng chỉ đọc. Trong Ruby, bạn đề cập đến các biến toàn cục bằng cách đặt tiền tố cho chúng bằng một đô la. Trong JavaScript, nó là nghịch đảo của Python. bạn khai báo tất cả các biến cục bộ và chúng mặc định là biến toàn cục (đó là một ý tưởng tồi tệ - nếu bạn quên khai báo một biến, bạn sẽ ngầm bắt đầu chia sẻ ở nơi mà bạn không muốn chia sẻ). Tất nhiên có thể có các ngôn ngữ khác gặp vấn đề này nhưng Python là ngôn ngữ duy nhất tôi từng thấy Người giới thiệu
Chia sẻ cái nàyNhư thế nàyThích Đang tải. Có liên quan8 bình luận 8 phản hồi cho “Py3K. Giải quyết vấn đề "phạm vi bên ngoài""
|