Biến toàn cục trong Python

Trong ngôn ngữ lập trình Python, một biến được khai báo bên ngoài hàm hoặc trong phạm vi toàn cục được gọi là biến toàn cục hay biến global. Biến toàn cục có thể được truy cập từ bên trong hoặc bên ngoài hàm.

Hãy xem ví dụ về cách tạo biến toàn cục trong Python.

x = "Biến toàn cục" #khai báo biến x
#Gọi x từ trong hàm vidu()
def vidu():
    print("x trong hàm vidu() :", x)

vidu()
#Gọi x ngoài hàm vidu()
print("x ngoài hàm vidu():", x)

Trong ví dụ trên, ta khai báo biến x là biến toàn cục, và định nghĩa hàm vidu() để in biến x. Cuối cùng ta gọi hàm vidu() để in giá trị của biến x. Chạy code trên ta sẽ được kết quả là:

x trong hàm vidu(): Biến toàn cc
x ngoài hàm vidu(): Biến toàn cc

Chuyện gì sẽ xảy ra nếu bạn thay đổi giá trị của x trong hàm?

x = 2 
def vidu():
   x=x*2    
   print(x)

vidu()

Nếu chạy code này bạn sẽ nhận được thông báo lỗi:

UnboundLocalError: local variable 'x' referenced before assignment

Lỗi này xuất hiện là do Python xử lý x như một biến cục bộ và x không được định nghĩa trong vidu().

Để thay đổi biến toàn cục trong một hàm bạn sẽ phải sử dụng từ khóa global. Chúng tôi sẽ nói kỹ hơn trong bài về từ khóa global.

Biến cục bộ trong Python

Biến được khai báo bên trong một hàm hoặc trong phạm vi cục bộ được gọi là biến cục bộ hay biến local.

def vidu():
 y = "Biến cục bộ"
vidu()
print(y)

Khi chạy code trên bạn sẽ nhận được thông báo lỗi:

NameError: name 'y' is not defined

Lỗi này xuất hiện là do chúng ta đã cố truy cập vào biến cục bộ y trong phạm vi toàn cục, nhưng y chỉ làm việc trong hàm vidu() hoặc phạm vi cục bộ.

Thông thường, để tạo một biến cục bộ, chúng ta sẽ khai báo nó trong một hàm như ví dụ dưới đây:

def vidu():
 y = "Biến cục bộ"
 print(y)
vidu()

Chạy code trên ta sẽ được kết quả

Biến cc b

Chúng ta quay trở lại xem xét vấn đề trước đó, lúc x là một biến toàn cục và chúng ta muốn thay đổi x trong vidu().

Biến cục bộ và biến toàn cục

Ở đây, chúng ta sẽ học cách dùng biến cục bộ và toàn cục trong cùng một code.

x = 2

def vidu():
 global x
 y = "Biến cục bộ"
 x = x * 2
 print(x)
 print(y)
#Viết bởi tinhoccuaem.com 
vidu()

Chạy code trên ta sẽ có đầu ra:

4
Biến cc b

Trong code trên, chúng ta khai báo x là biến toàn cục và y là biến cục bộ trong vidu() và dùng toán tử * để thay đổi biến toàn cục và in cả giá trị của x và y. Sau khi gọi hàm vidu() giá trị của x sẽ thành 4 vì được nhân đôi.

Ví dụ sử dụng biến toàn cục và cục bộ trùng tên:

x = 5

def vidu():
 x = 10
 print("Biến x cục bộ:", x)

vidu()
print("Biến x toàn cục:", x)

Sau khi chạy code trên ta có đầu ra:

Biến x cc bộ: 10
Biến x toàn cc: 5

Trong code trên, chúng ta sử dụng cùng tên x cho cả biến cục bộ và biến toàn cục. Khi in cùng biến x chúng ta nhận được hai kết quả khác nhau vì biến được khai báo ở cả hai phạm vi, cục bộ (bên trong hàm vidu()) và toàn cục (bên ngoài hàm vidu()).

Khi chúng ta in biến trong hàm vidu() nó sẽ xuất ra Biến x cục bộ: 10, đây được gọi là phạm vi cục bộ của biến. Tương tự khi ta in biến bên ngoài hàm vidu() sẽ cho ra Biến x toàn cục: 5, đây là phạm vi toàn cục của biến.

Biến nonlocal trong Python

Từ nonlocal này mình không biết dịch sang tiếng Việt sao cho chuẩn. Trong Python, biến nonlocal được sử dụng trong hàm lồng nhau nơi mà phạm vi cục bộ không được định nghĩa. Nói dễ hiểu thì biến nonlocal không phải biến local, không phải biến global, bạn khai báo một biến là nonlocal khi muốn sử dụng nó ở phạm vi rộng hơn local, nhưng chưa đến mức global.

Để khai báo biến nonlocal ta cần dùng đến từ khóa nonlocal.

Ví dụ:

def ham_ngoai():
    x = "Biến cục bộ"
 
    def ham_trong():
       nonlocal x
       x = "Biến nonlocal"
       print("Bên trong:", x)
 
    ham_trong()
    print("Bên ngoài:", x)

hamngoai()

Chạy code trên bạn sẽ có đầu ra:

Bên trong: Biến nonlocal
Bên ngoài: Biến nonlocal

Trong code trên có một hàm lồng là ham_trong(), ta dùng từ khóa nonlocal để tạo biến nonlocal. Hàm ham_trong() được định nghĩa trong phạm vi của ham_ngoai().

Lưu ý: Nếu chúng ta thay đổi giá trị của biến nonlocal, sự thay đổi sẽ xuất hiện trong biến cục bộ.

383 BÌNH LUẬN

  1. I was excited to find this site. I need to to thank you for your time for this fantastic read!! I definitely loved every part of it and i also have you book marked to see new stuff in your site.

  2. IaаАа’б‚Т€ТšаЂаŒаАа’б‚Т€ТžаБТžd should talk to you here. Which is not some thing I do! I quite like reading a post which will make people believe. Also, numerous thanks permitting me to comment!

  3. I simply could not depart your website prior to suggesting that I extremely loved the usual information a person provide in your guests? Is going to be back regularly to check up on new posts.

  4. The Internet is like alcohol in some sense. It accentuates what you would do anyway. If you want to be a loner, you can be more alone. If you want to connect, it makes it easier to connect.

  5. This is very interesting, You are a very skilled blogger. I have joined your feed and look forward to seeking more of your great post. Also, I have shared your website in my social networks!

  6. Wow! This could be one particular of the most beneficial blogs We ave ever arrive across on this subject. Actually Great. I am also an expert in this topic therefore I can understand your hard work.

  7. Much more people today need to read this and know this side of the story. I cant believe youre not more well-known considering that you undoubtedly have the gift.

  8. This is a really good tip particularly to those new to the blogosphere. Simple but very accurate info Thank you for sharing this one. A must read article!

  9. Wow! This could be one particular of the most beneficial blogs We ave ever arrive across on this subject. Actually Great. I am also an expert in this topic therefore I can understand your hard work.

  10. My brother recommended I might like this blog. He was totally right. This post actually made my day. You cann at imagine just how much time I had spent for this information! Thanks!

  11. Superb Article My brother suggested I might like this web site. He was totally right. This post truly made my day. You can not imagine simply how much time I had spent for this info! Thanks!

  12. Heya i’m for the first time here. I came across this board and I find It
    really useful & it helped me out a lot. I hope to give something back and aid others like you
    aided me.

  13. Very nice post. I just stumbled upon your blog and wished to say that I ave truly enjoyed browsing your blog posts. In any case I will be subscribing to your rss feed and I hope you write again soon!

  14. This is really interesting, You are a very skilled blogger. I ave joined your feed and look forward to seeking more of your wonderful post. Also, I have shared your website in my social networks!

  15. La impotencia sexual es física, es decir, se puede tener el deseo intenso de tener un encuentro sexual, pero o bien no consigues la erección o bien no se mantiene como para completar el acto. Si esta técnica no tiene éxito, puede resultar apropiado recurrir a la terapia del comportamiento sexual.

  16. My partner and I stumbled over here coming from a different web page and thought I may as well check things out.
    I like what I see so now i’m following you.
    Look forward to going over your web page yet again.

  17. Merely a smiling visitant here to share the love (:, btw great pattern. Better by far you should forget and smile than that you should remember and be sad. by Christina Georgina Rossetti.

  18. Wow, fantastic blog structure! How long have you been running a blog for? you made blogging glance easy. The full look of your web site is great, let alone the content!

  19. I saw plenty of website but I conceive this one contains a thing special in it. The finest effect regarding fine people is experienced after we ave got left their presence. by Rob Waldo Emerson.

  20. Pink your website post and cherished it. Have you at any time imagined about guest putting up on other relevant weblogs comparable to your website?

  21. Hi, Neat post. There’s an issue along with your site in web explorer,
    would test this? IE nonetheless is the marketplace leader and a big component of folks will leave out your excellent writing because of
    this problem.

  22. Hi would you mind letting me know which web host you’re using?
    I’ve loaded your blog in 3 completely different internet browsers and I must say this blog loads
    a lot quicker then most. Can you suggest a good
    hosting provider at a reasonable price? Kudos, I appreciate it!

  23. Wow! This could be one particular of the most useful blogs We have ever arrive across on this subject. Basically Great. I am also a specialist in this topic so I can understand your effort.

  24. whoah this weblog is excellent i really like reading your articles. Keep up the good work! You already know, a lot of persons are looking round for this information, you could help them greatly.

  25. You have made some decent points there. I checked on the internet for more info about the issue and found most individuals will go along with your views on this site.

  26. Im no professional, but I imagine you just made an excellent point. You definitely comprehend what youre talking about, and I can truly get behind that. Thanks for being so upfront and so genuine.

  27. This particular blog is really interesting additionally amusing. I have discovered a bunch of helpful advices out of this blog. I ad love to come back again soon. Thanks!

  28. Nice blog here! Also your site loads up very fast! What host are you using? Can I get your affiliate link to your host? I wish my web site loaded up as quickly as yours lol

  29. It’s a shame you don’t have a donate button! I’d without a doubt donate to
    this fantastic blog! I suppose for now i’ll settle for book-marking and adding
    your RSS feed to my Google account. I look forward to brand new updates and will share this blog with my Facebook group.
    Chat soon!

  30. This particular blog is obviously entertaining as well as informative. I have found a lot of interesting things out of this blog. I ad love to go back every once in a while. Cheers!

  31. This particular blog is obviously entertaining and also factual. I have found many interesting things out of this source. I ad love to return again and again. Thanks a bunch!

  32. Merely a smiling visitant here to share the love (:, btw great design. аАТ’аЂа‹аАТ’аЂ Treat the other man as faith gently it is all he has to believe with.аАТ’аЂ аАТ’аЂа› by Athenus.

  33. This blog is no doubt interesting and besides informative. I have chosen many helpful advices out of this blog. I ad love to go back every once in a while. Cheers!

  34. Sorry for my English.Great blog here! Also your site loads up fast! What host are you using? Can I get your affiliate link to your host? I wish my web site loaded up as quickly as yours lol.

  35. You could certainly see your enthusiasm within the work you write. The arena hopes for more passionate writers like you who are not afraid to mention how they believe. All the time follow your heart.

  36. This is really interesting, You are a very skilled blogger. I ave joined your feed and look forward to seeking more of your great post. Also, I ave shared your website in my social networks!

  37. wonderful post, very informative. I wonder why the other specialists of this sector don at notice this. You must continue your writing. I am confident, you ave a great readers a base already!

  38. We think you should read this I am still learning from you, as I am trying to reach my goals. I definitely love reading all that is posted on your blog.Keep the tips coming. I enjoyed it!

  39. You have made some decent points there. I looked on the web to find out more about the issue and found most people will go along with your views on this site.

  40. Wow, amazing blog format! How long have you been blogging for? you make blogging look easy. The total look of your site is wonderful, let alone the content material!

  41. You may find two to three new levels inside L. a. Weight loss and any one someone is incredibly important. Initial stage may be real melting away rrn the body. lose weight

  42. Regards for helping out, great info. аЂа‹аЂ I have witnessed the softening of the hardest of hearts by a simple smile.аЂ аЂа› by Goldie Hawn.

  43. Wow! This could be one particular of the most useful blogs We have ever arrive across on this subject. Basically Wonderful. I am also a specialist in this topic so I can understand your hard work.

  44. Wow! This can be one particular of the most useful blogs We have ever arrive across on this subject. Actually Great. I am also a specialist in this topic therefore I can understand your hard work.

  45. We are a gaggle of volunteers and starting a brand new scheme in our community.
    Your website offered us with valuable information to work
    on. You have done a formidable task and our entire
    community shall be thankful to you.

THOÁT KHỎI BÌNH LUẬN

Please enter your comment!
Please enter your name here