Biến local là gì

Trước hết, tôi không phải là người trong hình ảnh trên. Tôi chỉ là một nhà văn nhân từ ở đây để nói về một trong những khái niệm khó hiểu nhất trong lập trình Python “ Biến toàn cục, cục bộ và phi địa phương ”. Tôi biết sau khi đọc tiêu đề, bạn sẽ giống như " Tại sao tôi phải lo lắng về điều này ". Chà, câu trả lời là đôi khi không biết những thứ nhỏ xíu nhỏ xíu này sẽ khiến bạn phải trả giá đắt. Vì vậy, không cần thêm ado, chúng ta hãy bắt đầu.

Trong các ngôn ngữ lập trình như C / C ++, mỗi khi một biến được khai báo đồng thời, một vùng nhớ sẽ được cấp phát, việc cấp phát này sẽ hoàn toàn phụ thuộc vào kiểu biến. Do đó, người lập trình phải chỉ định kiểu biến trong khi tạo một biến. Nhưng may mắn thay, trong Python, bạn không phải làm điều đó. Python không có khai báo kiểu biến. Giống như con trỏ trong C, các biến trong Python không lưu trữ các giá trị một cách hợp pháp; chúng hoạt động với các tham chiếu làm nổi bật các đối tượng trong bộ nhớ.

Chủ đề

Danh sách các chủ đề sẽ được đề cập trong bài viết này được đưa ra dưới đây:

  • Các biến - Giới thiệu nhanh
  • Biến toàn cục - Cách loại bỏUnboundLocalError
  • Biến cục bộ - Cách loại bỏNameError
  • Biến phi địa phương - Khi nào và cách sử dụng chúng

Biến

Một biến có nhiều khả năng là một vùng chứa để lưu trữ các giá trị. Bây giờ các giá trị được lưu trữ phụ thuộc vào các lập trình viên có nên sử dụng số nguyên, float, string hoặc vv .

Biến giống như một hộp trong bộ nhớ của máy tính, nơi bạn có thể lưu trữ một giá trị duy nhất. - Al Sweigart

Không giống như các ngôn ngữ lập trình khác, trong Python, bạn không cần phải khai báo bất kỳ biến nào hoặc khởi tạo chúng. Hãy đọc cái này .

Cú pháp

Cú pháp chung để tạo một biến trong Python như sau:

variable_name = value

Trong variable_name Python có thể ngắn gọn như a, b, x, y, ...hoặc có thể rất giàu thông tin, chẳng hạn nhưage, height, name, student_name, covid, ...

Mặc dù chúng tôi khuyên bạn nên giữ một tên biến mang tính mô tả để cải thiện khả năng đọc.

Quy tắc

Tất cả đã được thiết lập và hoàn tất, có một số quy tắc bạn cần tuân theo khi đặt tên biến:

  • Tên biến phải bắt đầu bằng một chữ cái hoặc ký tự gạch dưới
  • Tên biến không được bắt đầu bằng số
  • Tên biến chỉ có thể chứa các ký tự chữ-sốdấu gạch dưới. Ví dụ: bất kỳ điều gì như thế này đều hợp lệ: Az, 0–9 và _
  • Tên biến có phân biệt chữ hoa chữ thường ( chiều cao , Chiều caoCHIỀU CAO là ba tên biến khác nhau)

Dưới đây là một ví dụ để khởi tạo đúng giá trị cho một biến:

# This is a valid and good way to assign a value to a variable # Let's assign values to variables to calculate the area of a circle pi = 3.142 # I could have also used "math" library radius = 5 # Interger value for radius area_of_circle = 0 # Used to store the value of area of circle area_of_circle = pi * (radius) ** 2 # Area = (PI * R^2) print("The area of the circle is: ", area_of_circle) The area of the circle is: 78.55

Tôi tin rằng chỉ cần nhìn thấy một bức tranh hoặc một hình ảnh, các khái niệm có thể được hiểu nhanh hơn. Dưới đây là biểu diễn bằng hình ảnh của một biến và nó được lưu trữ trong bộ nhớ.

Biến toàn cục

Trong Python hay bất kỳ ngôn ngữ lập trình nào khác, định nghĩa về biến toàn cục vẫn giữ nguyên, đó là “ Một biến được khai báo bên ngoài hàm được gọi là hàm toàn cục ”. Chúng ta có thể truy cập một biến toàn cục bên trong hoặc bên ngoài hàm.

Tạo một biến toàn cục và truy cập nó

Hãy sử dụng cùng một ví dụ ở trên để hiểu khái niệm truy cập biến bên trong và bên ngoài hàm.

pi = 3.142 # I could have also used "math" library (math.pi) radius = 5 # Interger value for radius def circle(): area_of_circle = pi * (radius) ** 2 print("The area of the circle is: ", area_of_circle) circumference_of_circle = 2 * pi * radius # Accessing the global variables outside the function print("The circumference of the circle: ", circumference_of_circle) # Accessing the global variables inside the function circle() The circumference of the circle: 31.419999999999998 The area of the circle is: 78.55

Tìm hiểu chi tiết về “UnboundLocalError”

Bây giờ chúng ta hãy lấy cùng một ví dụ cũ và cố gắng cập nhật nhân radius 2 (nhân với 2)

pi = 3.142 # I could have also used "math" library (math.pi) radius = 5 # Interger value for radius def circle(): radius = radius * 2 # Update the radius by (x 2) area_of_circle = pi * (radius) ** 2 print("The area of the circle is: ", area_of_circle) circle() # Accessing the global variables inside the function

Như đã thấy trong đoạn mã trên, nếu bạn cố gắng cập nhật bán kính và sau đó thực thi đoạn mã này, bạn sẽ ngạc nhiên. Đừng hào hứng và nói “ Tôi đã làm được ” bởi vì bạn đã không làm như vậy, thay vào đó bạn sẽ được nhắc nhở bởi một lỗi có tên UnboundLocalError. Nhiều khả năng lỗi trông như thế này.

UnboundLocalError: local variable 'radius' referenced before assignment pi = 3.142 # I could have also used "math" library (math.pi) radius = 5 # Interger value for radius def circle(): global radius # Making raduis a global variable radius = radius * 2 # Update the radius by (x 2) area_of_circle = pi * (radius) ** 2 print("The area of the circle is: ", area_of_circle) circle() The area of the circle is: 314.2

Biến cục bộ

Trong Python hoặc bất kỳ ngôn ngữ lập trình nào khác, định nghĩa của các biến cục bộ vẫn giữ nguyên, đó là “ Một biến được khai báo bên trong hàm được gọi là hàm cục bộ ”. Chúng ta có thể truy cập một biến cục bộ bên trong nhưng không thể truy cập bên ngoài hàm.

Tạo một biến cục bộ và truy cập nó

Chúng tôi sử dụng các biến cục bộ bên trong một hàm và không cố gắng truy cập chúng bên ngoài các hàm đó. Do đó tên địa phương. Nhưng phần tốt là chúng ta có thể truy cập các biến đó trong chính các hàm.

def circle(): pi = 3.142 # I could have also used "math" library (math.pi) radius = 5 # Interger value for radius area_of_circle = pi * (radius) ** 2 print("The area of the circle is: ", area_of_circle) circumference_of_circle = 2 * pi * radius # Accessing the global variables inside the function circle() The area of the circle is: 78.55

Tìm hiểu chi tiết về “NameError”

Hãy sử dụng cùng một ví dụ ở trên và truy cập các biến được khai báo bên trong hàm:

def circle(): pi = 3.142 # I could have also used "math" library (math.pi) radius = 5 # Interger value for radius area_of_circle = pi * (radius) ** 2 print("The area of the circle is: ", area_of_circle) circumference_of_circle = 2 * pi * radius # Accessing the global variables outside the function print("The circumference of the circle: ", circumference_of_circle) # Accessing the global variables inside the function circle() NameError: name 'pi' is not defined

Biến phi địa phương

Trong Python hoặc bất kỳ ngôn ngữ lập trình nào khác, chúng ta thường sử dụng biến phi địa phương bên trong các hàm lồng nhau. Bây giờ, ý tôi là gì bởi các hàm lồng nhau?

Các hàm lồng nhau

Nói chung, một hàm lồng nhau là một tập hợp các hàm được khai báo bên trong một hàm khác. Dưới đây là một ví dụ về một hàm lồng nhau.

def circle(): pi = 3.142 # I could have also used "math" library (math.pi) radius = 5 # Interger value for radius area_of_circle = pi * (radius) ** 2 def circumference(): # Formula for circumference circumference_of_circle = 2 * pi * radius return circumference_of_circle print(circumference()) # Calling the circumference function return area_of_circle print(circle()) # Calling the circle function 31.419999999999998 78.55

Bây giờ chúng ta hãy thử cập nhật bán kính bằng 2 (nhân với 2) bên trong circumference(). Lý do mà tôi đặc biệt khăng khăng làm điều này vì ngay sau khi bạn viết radius = radius * 2và chạy mã, bạn sẽ được nhắc UnboundLocalError khi thấy điều này, bạn sẽ thay đổi nó thành một biến toàn cục bằng cách nói global radiusnhưng lần này bạn sẽ gặp một lỗi mới là NameError. Và bây giờ bạn sẽ bối rối, không biết phải làm gì. Có một cách đơn giản để giải quyết vấn đề này " Hãy đọc định nghĩa của một biến phi địa phương ". Bất cứ khi nào có một hàm lồng nhau, bạn cần sử dụng một nonlocal biến. Đó là vấn đề đã được giải quyết. Dưới đây là cách tạo một biến phi địa phương và truy cập nó.

def circle(): pi = 3.142 # I could have also used "math" library (math.pi) radius = 5 # Interger value for radius area_of_circle = pi * (radius) ** 2 def circumference(): nonlocal radius # Nonlocal variable radius = radius * 2 # Formula for circumference circumference_of_circle = 2 * pi * radius return circumference_of_circle print(circumference()) # Calling the circumference function return area_of_circle print(circle()) # Calling the circle function 62.839999999999996 78.55

Đây là phần cuối của bài viết có tiêu đề “ Biến toàn cục, cục bộ và phi địa phương trong Python ”. Tôi hy vọng các bạn đã học được một hoặc hai điều khi đọc bài viết này. Thông qua bài viết này, bạn đã học được cách loại bỏ hai lỗi Python quan trọng, chẳng hạn như NameError và những lỗi UnboundLocalError đã gây khó khăn cho bạn suốt những ngày qua hoặc nhiều năm hoặc bất cứ điều gì. Bây giờ bạn có thể dễ dàng gỡ lỗi hai lỗi này với một nụ cười trên khuôn mặt của bạn mà không mất một giọt mồ hôi. Nếu bạn có bất kỳ nhận xét hoặc đề xuất nào về bài viết này, thì phần bình luận là của bạn. Hãy theo dõi để cập nhật thêm, cho đến khi tạm biệt. Hãy viết mã an toàn và vui vẻ và hẹn gặp lại bạn lần sau.