Vùng tên Python và Phạm vi của một biến

Trong hướng dẫn này, bạn sẽ tìm hiểu về không gian tên, ánh xạ từ tên đến đối tượng và phạm vi của một biến.

Tên trong Python là gì?

Nếu bạn đã từng đọc 'The Zen of Python' (nhập import thistrình thông dịch Python), thì dòng cuối cùng cho biết, Không gian tên là một ý tưởng tuyệt vời - hãy làm nhiều hơn nữa! Vậy những không gian tên bí ẩn này là gì? Đầu tiên chúng ta hãy xem tên là gì.

Tên (còn được gọi là định danh) chỉ đơn giản là tên được đặt cho các đối tượng. Mọi thứ trong Python đều là một đối tượng. Tên là một cách để truy cập đối tượng bên dưới.

Ví dụ, khi chúng ta thực hiện nhiệm vụ a = 2, 2là một đối tượng được lưu trữ trong bộ nhớ và a là tên mà chúng ta liên kết với nó. Chúng ta có thể lấy địa chỉ (trong RAM) của đối tượng nào đó thông qua hàm tích hợp sẵn id(). Hãy xem cách sử dụng nó.

 # Note: You may get different values for the id a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))

Đầu ra

 id (2) = 9302208 id (a) = 9302208

Ở đây, cả hai đều đề cập đến cùng một đối tượng 2, vì vậy chúng có cùng một id(). Hãy làm cho mọi thứ thú vị hơn một chút.

 # Note: You may get different values for the id a = 2 print('id(a) =', id(a)) a = a+1 print('id(a) =', id(a)) print('id(3) =', id(3)) b = 2 print('id(b) =', id(b)) print('id(2) =', id(2))

Đầu ra

 id (a) = 9302208 id (a) = 9302240 id (3) = 9302240 id (b) = 9302208 id (2) = 9302208

Điều gì đang xảy ra trong trình tự các bước trên? Hãy sử dụng một sơ đồ để giải thích điều này:

Sơ đồ bộ nhớ của các biến trong Python

Ban đầu, một đối tượng 2được tạo và tên a được liên kết với nó, khi chúng ta làm vậy a = a+1, một đối tượng mới 3được tạo và bây giờ a được liên kết với đối tượng này.

Lưu ý rằng id(a)id(3)có các giá trị giống nhau.

Hơn nữa, khi b = 2được thực thi, tên mới b sẽ được liên kết với đối tượng trước đó 2.

Điều này hiệu quả vì Python không phải tạo một đối tượng trùng lặp mới. Bản chất động này của liên kết tên làm cho Python mạnh mẽ; tên có thể đề cập đến bất kỳ loại đối tượng nào.

 >>> a = 5 >>> a = 'Hello World!' >>> a = (1,2,3)

Tất cả những điều này đều hợp lệ và một sẽ đề cập đến ba loại đối tượng khác nhau trong các trường hợp khác nhau. Các hàm cũng là các đối tượng, vì vậy một cái tên cũng có thể đề cập đến chúng.

 def printHello(): print("Hello") a = printHello a()

Đầu ra

 xin chào

Tên tương tự a có thể chỉ một hàm và chúng ta có thể gọi hàm bằng tên này.

Không gian tên trong Python là gì?

Bây giờ chúng ta đã hiểu tên là gì, chúng ta có thể chuyển sang khái niệm không gian tên.

Nói một cách đơn giản, không gian tên là một tập hợp các tên.

Trong Python, bạn có thể hình dung một không gian tên như một ánh xạ của mọi tên mà bạn đã xác định với các đối tượng tương ứng.

Các không gian tên khác nhau có thể cùng tồn tại tại một thời điểm nhất định nhưng hoàn toàn bị cô lập.

Một không gian tên chứa tất cả các tên dựng sẵn được tạo khi chúng ta khởi động trình thông dịch Python và tồn tại miễn là trình thông dịch chạy.

Đây là lý do mà các chức năng tích hợp sẵn như id(), print()v.v. luôn có sẵn cho chúng tôi từ bất kỳ phần nào của chương trình. Mỗi mô-đun tạo không gian tên chung của riêng nó.

Các không gian tên khác nhau này được tách biệt. Do đó, tên giống nhau có thể tồn tại trong các mô-đun khác nhau không xung đột với nhau.

Mô-đun có thể có nhiều chức năng và lớp khác nhau. Không gian tên cục bộ được tạo khi một hàm được gọi, có tất cả các tên được xác định trong nó. Tương tự, là trường hợp với lớp. Sơ đồ sau có thể giúp làm rõ khái niệm này.

Sơ đồ các không gian tên khác nhau trong Python

Phạm vi biến trong Python

Mặc dù có nhiều không gian tên duy nhất được xác định, chúng tôi có thể không truy cập được tất cả chúng từ mọi phần của chương trình. Khái niệm phạm vi phát huy tác dụng.

Phạm vi là một phần của chương trình mà từ đó không gian tên có thể được truy cập trực tiếp mà không cần bất kỳ tiền tố nào.

Tại bất kỳ thời điểm nào, có ít nhất ba phạm vi lồng nhau.

  1. Phạm vi của hàm hiện tại có tên cục bộ
  2. Phạm vi của mô-đun có tên chung
  3. Phạm vi ngoài cùng có tên tích hợp

Khi một tham chiếu được thực hiện bên trong một hàm, tên được tìm kiếm trong không gian tên cục bộ, sau đó trong không gian tên chung và cuối cùng là trong không gian tên dựng sẵn.

Nếu có một hàm bên trong một hàm khác, một phạm vi mới sẽ được lồng bên trong phạm vi cục bộ.

Ví dụ về Phạm vi và Không gian tên trong Python

 def outer_function(): b = 20 def inner_func(): c = 30 a = 10

Here, the variable a is in the global namespace. Variable b is in the local namespace of outer_function() and c is in the nested local namespace of inner_function().

When we are in inner_function(), c is local to us, b is nonlocal and a is global. We can read as well as assign new values to c but can only read b and a from inner_function().

If we try to assign as a value to b, a new variable b is created in the local namespace which is different than the nonlocal b. The same thing happens when we assign a value to a.

However, if we declare a as global, all the reference and assignment go to the global a. Similarly, if we want to rebind the variable b, it must be declared as nonlocal. The following example will further clarify this.

 def outer_function(): a = 20 def inner_function(): a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)

As you can see, the output of this program is

 a = 30 a = 20 a = 10

Trong chương trình này, ba biến khác nhau a được định nghĩa trong các không gian tên riêng biệt và được truy cập tương ứng. Trong chương trình sau,

 def outer_function(): global a a = 20 def inner_function(): global a a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)

Đầu ra của chương trình là.

 a = 30 a = 30 a = 30 

Ở đây, tất cả các tham chiếu và bài tập là toàn cầu do việc sử dụng từ khóa global.

thú vị bài viết...