Hướng dẫn module global variable python - mô-đun biến toàn cầu python

Bởi Bernd Klein. Sửa đổi lần cuối: 29 tháng 6 năm 2022.Bernd Klein. Last modified: 29 Jun 2022.

Trên trang này

Cách Python sử dụng các biến toàn cầu và địa phương là Maverick. Mặc dù trong nhiều hoặc hầu hết các biến ngôn ngữ lập trình khác được coi là toàn cầu nếu không được tuyên bố khác, Python liên quan đến các biến theo cách khác. Họ là địa phương, nếu không tuyên bố. Lý do lái xe đằng sau phương pháp này là các biến toàn cầu nói chung là thực tiễn xấu và nên tránh. Trong hầu hết các trường hợp bạn bị cám dỗ sử dụng biến toàn cầu, tốt hơn là sử dụng một tham số để lấy giá trị vào một hàm hoặc trả về giá trị để lấy nó ra. Giống như trong nhiều cấu trúc chương trình khác, Python cũng áp đặt thói quen lập trình tốt theo thiết kế.

Vì vậy, khi bạn xác định các biến bên trong một định nghĩa hàm, chúng là cục bộ cho hàm này theo mặc định. Đó là, bất cứ điều gì bạn sẽ làm cho một biến như vậy trong phần thân của hàm sẽ không có tác dụng đối với các biến khác bên ngoài hàm, ngay cả khi chúng có cùng tên. Nói cách khác, cơ thể hàm là phạm vi của một biến như vậy, tức là bối cảnh kèm theo nơi tên này được liên kết với các giá trị của nó.

Tất cả các biến có phạm vi của khối, nơi chúng được khai báo và xác định. Chúng chỉ có thể được sử dụng sau điểm tuyên bố của họ.

Chỉ để làm cho mọi thứ rõ ràng: các biến không cần phải và không thể được khai báo theo cách chúng được khai báo bằng các ngôn ngữ lập trình như Java hoặc C. Biến trong Python được tuyên bố hoàn toàn bằng cách xác định chúng, tức là lần đầu tiên bạn gán một Giá trị cho một biến, biến này được khai báo và tự động là loại dữ liệu của đối tượng phải được gán cho nó. Nếu bạn có vấn đề khi hiểu điều này, vui lòng tham khảo chương của chúng tôi về các loại dữ liệu và biến, hãy xem các liên kết ở phía bên trái.

Các biến toàn cầu và địa phương trong các chức năng

Hướng dẫn module global variable python - mô-đun biến toàn cầu python

Trong ví dụ sau, chúng tôi muốn chứng minh làm thế nào các giá trị toàn cầu có thể được sử dụng bên trong phần thân của một hàm:

def f(): 
    print(s) 
s = "I love Paris in the summer!"
f()

OUTPUT:

I love Paris in the summer!

Biến S được định nghĩa là chuỗi "Tôi yêu Paris vào mùa hè!", Trước khi gọi hàm f (). Cơ thể của f () chỉ bao gồm câu lệnh "in (S)". Vì không có biến cục bộ S, tức là không có sự gán cho S, giá trị từ biến toàn cầu sẽ được sử dụng. Vì vậy, đầu ra sẽ là chuỗi "Tôi yêu Paris vào mùa hè!". Câu hỏi là, điều gì sẽ xảy ra, nếu chúng ta thay đổi giá trị của S bên trong hàm f ()? Nó sẽ ảnh hưởng đến biến toàn cầu? Chúng tôi kiểm tra điều này trong phần mã sau:

def f(): 
    s = "I love London!"
    print(s) 

s = "I love Paris!" 
f()
print(s)

OUTPUT:

I love London!
I love Paris!

Điều gì sẽ xảy ra nếu chúng ta kết hợp ví dụ đầu tiên với mẫu thứ hai, tức là trước tiên chúng ta truy cập s với hàm in (), hy vọng sẽ có được giá trị toàn cầu và sau đó gán một giá trị mới cho nó? Gán một giá trị cho nó, có nghĩa là - như chúng tôi đã nêu trước đây - tạo một biến cục bộ s. Vì vậy, chúng tôi sẽ có S vừa là một biến toàn cầu và cục bộ trong cùng một phạm vi, tức là cơ thể của hàm. Python may mắn không cho phép sự mơ hồ này. Vì vậy, nó sẽ gây ra lỗi, như chúng ta có thể thấy trong ví dụ sau:

def f(): 
   print(s)
   s = "I love London!"
   print(s)
 
s = "I love Paris!"
f()

Đầu ra:

---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
 in 
      5 
      6 s = "I love Paris!"
----> 7 f()
 in f()
      1 def f():
----> 2    print(s)
      3    s = "I love London!"
      4    print(s)
      5 
UnboundLocalError: local variable 's' referenced before assignment

Một biến không thể là cả địa phương và toàn cầu bên trong một chức năng. Vì vậy, Python quyết định rằng chúng tôi muốn một biến cục bộ do gán cho s bên trong f (), vì vậy câu lệnh in đầu tiên trước khi định nghĩa S ném thông báo lỗi ở trên. Bất kỳ biến nào được thay đổi hoặc tạo bên trong một hàm là cục bộ, nếu nó không được khai báo là một biến toàn cầu. Để nói với Python, rằng chúng tôi muốn sử dụng biến toàn cầu, chúng tôi phải nêu rõ điều này bằng cách sử dụng từ khóa "toàn cầu", như có thể thấy trong ví dụ sau:

def f():
    global s
    print(s)
    s = "Only in spring, but London is great as well!"
    print(s)


s = "I am looking for a course in Paris!" 
f()
print(s)

OUTPUT:

I am looking for a course in Paris!
Only in spring, but London is great as well!
Only in spring, but London is great as well!

Không thể truy cập các biến cục bộ của các hàm từ bên ngoài, khi cuộc gọi hàm kết thúc. Đây là sự tiếp nối của ví dụ trước:

def f():
    s = "I am globally not known"
    print(s) 

f()
print(s)

OUTPUT:

I am globally not known
Only in spring, but London is great as well!

Ví dụ sau đây cho thấy sự kết hợp hoang dã của các biến và tham số chức năng địa phương và toàn cầu:

I love Paris in the summer!
0

OUTPUT:

Các biến toàn cầu trong các chức năng lồng nhau

Chúng tôi sẽ kiểm tra ngay bây giờ những gì sẽ xảy ra, nếu chúng tôi sử dụng từ khóa toàn cầu bên trong các chức năng lồng nhau. Ví dụ sau đây cho thấy một tình huống trong đó một biến 'thành phố' được sử dụng trong các phạm vi khác nhau:

I love Paris in the summer!
1

OUTPUT:

I love Paris in the summer!
2

Chúng ta có thể thấy rằng tuyên bố toàn cầu bên trong hàm lồng nhau G không ảnh hưởng đến biến 'thành phố' của hàm f, tức là nó giữ giá trị của nó 'Hamburg'. Chúng ta cũng có thể suy luận từ ví dụ này rằng sau khi gọi f () một biến 'thành phố' tồn tại trong không gian tên mô -đun và có giá trị 'Geneva'. Điều này có nghĩa là từ khóa toàn cầu trong các chức năng lồng nhau không ảnh hưởng đến không gian tên của không gian tên bao quanh của chúng! Điều này phù hợp với những gì chúng tôi đã tìm thấy trong chương trình con trước: một biến được xác định bên trong hàm là cục bộ trừ khi nó được đánh dấu rõ ràng là toàn cầu. Nói cách khác, chúng ta có thể đề cập đến một tên biến trong bất kỳ phạm vi kèm theo nào, nhưng chúng ta chỉ có thể phản hồi các tên biến trong phạm vi cục bộ bằng cách gán cho nó hoặc trong phạm vi mô-đun-Global bằng cách sử dụng khai báo toàn cầu. Chúng tôi cũng cần một cách để truy cập các biến của phạm vi khác là tốt. Cách để làm điều này là các định nghĩa phi địa chỉ, mà chúng tôi sẽ giải thích trong chương tiếp theo.

Biến không thuộc địa điểm

Python3 đã giới thiệu các biến không thuộc địa như một loại biến mới. Các biến không thuộc địa điểm có rất nhiều điểm chung với các biến toàn cầu. Một sự khác biệt đối với các biến toàn cầu nằm ở chỗ thực tế là không thể thay đổi các biến từ phạm vi mô -đun, tức là các biến không được xác định bên trong hàm, bằng cách sử dụng câu lệnh không thuộc địa. Chúng tôi hiển thị điều này trong hai ví dụ sau:

I love Paris in the summer!
3

OUTPUT:

Chương trình này là chính xác và trả về 'Frankfurt' làm đầu ra. Chúng tôi sẽ thay đổi "Toàn cầu" thành "Không thuộc về" trong chương trình sau:

I love Paris in the summer!
4

OUTPUT:

I love Paris in the summer!
5

Điều này cho thấy rằng các ràng buộc phi địa chỉ chỉ có thể được sử dụng bên trong các chức năng lồng nhau. Một biến không thuộc địa phải được xác định trong phạm vi hàm kèm theo. Nếu biến không được xác định trong phạm vi hàm bao quanh, biến không thể được xác định trong phạm vi lồng nhau. Đây là một sự khác biệt khác đối với ngữ nghĩa "toàn cầu".

I love Paris in the summer!
6

OUTPUT:

I love Paris in the summer!
7

Trong ví dụ trước, biến 'thành phố' đã được xác định trước cuộc gọi của g. Chúng tôi gặp lỗi nếu nó không được xác định:

I love Paris in the summer!
8

OUTPUT:

I love Paris in the summer!
9

Chương trình hoạt động tốt - có hoặc không có dòng 'City = "Munich"' bên trong F -, nếu chúng ta thay đổi "không thuộc tính" thành "toàn cầu":

def f(): 
    s = "I love London!"
    print(s) 

s = "I love Paris!" 
f()
print(s)
0

OUTPUT:

def f(): 
    s = "I love London!"
    print(s) 

s = "I love Paris!" 
f()
print(s)
1

Tuy nhiên, có một sự khác biệt rất lớn: giá trị của toàn cầu X được thay đổi bây giờ!

Đào tạo Python sống

Các khóa học trực tuyến sắp tới

Ghi danh ở đây