Python dainganxanh
  • Lời nói đầu
  • Chương I. SƠ LƯỢC
    • Bài 1. Cài đặt môi trường
    • Bài 2. Từ khóa và định danh
    • Bài 3. Câu lệnh, khối lệnh và chú thích
    • Bài 4. Nhập, xuất dữ liệu
    • Bài 5. Toán tử và lệnh gán
    • Bài 6. Biến, Hằng
    • Bài 7. Kiểu dữ liệu
    • Bài 8. Thao tác với tệp (cơ bản)
    • Bài 9. Tổng quan về Python
    • Bài tập chương 1
  • Chương II. RẼ NHÁNH - LẶP
    • Bài 10. Cấu trúc rẽ nhánh if…else
    • Bài 11. Cấu trúc lặp với for
    • Bài 12. Cấu trúc lặp với while
    • Bài 13. Lệnh break và continue
    • Bài tập chương 2
  • Chương III. HÀM & MODULE
    • Bài 14. Hàm
    • Bài 15. Tham số hàm
    • Bài 16. Đệ quy
    • Bài 17. Hàm ẩn danh
    • Bài 18. Biến toàn cục và cục bộ
    • Bài 19. Module
    • Bài 20. Package
  • Chương IV. KIỂU DỮ LIỆU
    • Bài 21. Dữ liệu kiểu số
    • Bài 22. Dữ liệu kiểu string
    • Bài 23. Dữ liệu kiểu list
    • Bài 24. Dữ liệu kiểu tuple
    • Bài 25. Dữ liệu kiểu set
    • Bài 26. Dữ liệu kiểu dictionary
  • Chương V. TỆP & THƯ MỤC
    • Bài 27. Đọc và ghi file
    • Bài 28. Quản lý file và folder
  • Chương VI. LỖI & NGOẠI LỆ
    • Bài 29. Ngoại lệ
    • Bài 30. Xử lý ngoại lệ
    • Bài 31. Xây dựng ngoại lệ
  • Chương VII. HƯỚNG ĐỐI TƯỢNG
    • Bài 32. Lập trình hướng đối tượng
    • Bài 33. Đối tượng và Lớp
    • Bài 34. Kế thừa
    • Bài 35. Đa kế thừa
    • Bài 36. Nạp chồng toán tử
  • Chương VIII. NGÀY - GIỜ
    • Python datetime
    • Python strftime()
    • Python strptime()
    • Current date and time
    • Get Current time
    • Timestamp to datetime
    • Python time Module
    • Python sleep()
  • Chương IX. CHỦ ĐỀ NÂNG CAO
    • Python Iterators
    • Python Generators
    • Python Closures
    • Python Decorators
    • Python @property decorator
    • Python RegEx
    • Python Examples
  • PHỤ LỤC - GHI CHÉP
    • Hàm map()
    • Cài Sublime Text để code Python
    • Ghi chép - ghi chú
    • Mảng 2 chiều
    • Công thức với dãy số
  • Tài liệu tham khảo
  • www.dainganxanh.com
  • 🐍Khóa học Python
  • 🤷‍♀️Hỏi đáp, chia sẻ (FG)
  • 🎮Sinh Test chấm Themis
Powered by GitBook
On this page
  • 1. Biến toàn cục (global)
  • 2. Biến cục bộ (local)
  • 3. Biến không cục bộ (nonlocal)
  • 4. Ví dụ tổng hợp
  • Ví dụ 4.1
  • Ví dụ 4.2
  • Ví dụ 4.3

Was this helpful?

  1. Chương III. HÀM & MODULE

Bài 18. Biến toàn cục và cục bộ

Biến cục bộ (local) là biến có hiệu lực trong nội bộ của hàm. Biến toàn cục (global) là biến có hiệu lực trong toàn chương trình - tuy nhiên nó cần được khai báo để có thể hoạt động trong thân hàm.

1. Biến toàn cục (global)

Ví dụ 1

x = "biến toàn cục - global"

def foo():
    print("x trong hàm:", x)

foo()
print("x ngoài hàm:", x)

Output:

x trong hàm: biến toàn cục - global x ngoài hàm: biến toàn cục - global

Xét ví dụ 2

x = "biến global "

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

foo()

Output: Báo lỗi "UnboundLocalError: local variable 'x' referenced before assignment"

Biến x được khai báo ngoài hàm và được gán giá trị là "biến global". Tuy nhiên, câu lệnh ở dòng 4 có sử dụng biến x trong hàm (lúc này x được coi làm một local và chưa được khai báo) nên phát sinh lỗi.

Để khắc phục lỗi này ta có thể khai báo biến x trong hàm là biến toàn cục với keyword global như sau:

x = "biến global "

def foo():
    global x
    x = x * 2
    print(x)

foo()

Ouput: biến global biến global

2. Biến cục bộ (local)

Thông thường, chúng ta khai báo một biến bên trong hàm để tạo một biến cục bộ. Ví dụ như sau:

def foo():
    y = "local"
    print(y)

foo()

Output: local

Tuy nhiên, chương trình sau đây sẽ báo lỗi

def foo():
    y = "local"

foo()
print(y)

Output: NameError: name 'y' is not defined

Nguyên nhân: Chương trình trên gọi biến y ngoài hàm trong khi biến y là một biến local (chỉ có phạm vi hoạt động trong hàm, biến y sẽ bị hủy khi thoát khỏi hàm foo())

3. Biến không cục bộ (nonlocal)

Sử dụng khái niệm global, local trong trường hợp hàm trong hàm. Xét ví dụ dau:

x = 5
def outer():
    x = "local"
    def inner():
        nonlocal x
        x = "nonlocal"
        print("inner:", x)

    inner()
    print("outer:", x)

outer()
print(x)

Output: inner: nonlocal outer: nonlocal 5

Giải thích: Vì inner là một hàm trong hàm nên để biến x trong hàm inner() có thể hoạt động ngoài thân hàm inner() thì phải khai báo với từ khóa nonlocal. Lúc này x trong hàm inner() chính là x của hàm outter().

4. Ví dụ tổng hợp

Ví dụ 4.1

x = "global "

def foo():
    global x
    y = "local"
    x = x * 2
    print(x)
    print(y)

foo()

Output: global global local

Ví dụ 4.2

x = 5

def foo():
    x = 10
    print("local x:", x)

foo()
print("global x:", x)

Output : local x: 10 global x: 5

Ở ví dụ này biến global và local cùng có tên là x. Tuy nhiên do phạm vi hoạt động của global và local là rạch ròi nên chương trình là hợp lệ và hoạt động bình thường.

Ví dụ 4.3

Xem xét kỹ ví dụ sau để thấy phạm vi biến global, local và nonlocal

x = 25
y = '- hai lăm'
def foo():
    x = 20
    y = '- hai mươi'
    def bar():
        nonlocal x
        x = 35
        
        global y
        y = '- ba lăm'

    print("\t x - y trước khi gọi hàm bar: \t", x, y)
    bar()
    print("\t x - y sau khi gọi hàm bar: \t", x, y)

print('x - y ngoài hàm,trước khi gọi hàm foo: \t', x, y)
foo()
print("x - y ngoài hàm, sau khi gọi foo: \t", x, y)

Output:

x - y ngoài hàm,trước khi gọi hàm foo: 25 - hai lăm x - y trước khi gọi hàm bar: 20 - hai mươi x - y sau khi gọi hàm bar: 35 - hai mươi x - y ngoài hàm, sau khi gọi foo: 25 - ba lăm

PreviousBài 17. Hàm ẩn danhNextBài 19. Module

Last updated 4 years ago

Was this helpful?