Tên và giá trị trong Python
Cách đây mấy ngày, tôi có trao đổi với đồng nghiệp của mình về cách làm việc của tên (names) và giá trị (values) trong Python. Và tôi nghĩ còn nhiều người vẫn chưa thực sự hiểu rõ về nó, nhân tiện có bài viết khá trực quan và dễ hiểu về vấn đề này mà tôi lượm được trên mạng nên tôi muốn chia sẻ ...
Cách đây mấy ngày, tôi có trao đổi với đồng nghiệp của mình về cách làm việc của tên (names) và giá trị (values) trong Python. Và tôi nghĩ còn nhiều người vẫn chưa thực sự hiểu rõ về nó, nhân tiện có bài viết khá trực quan và dễ hiểu về vấn đề này mà tôi lượm được trên mạng nên tôi muốn chia sẻ cùng mọi người.
Tên và giá trị
Đơn giản thì:
Tên tham chiếu tới giá trị.
Như trong nhiều ngôn ngữ khác, câu lệnh gán trong Python liên kết một tên bên trái với một giá trị bên phải. Trong Python, ta nói rằng tên tham chiếu tới giá trị:
x = 23
Sau câu lệnh trên, tên "x" tham chiếu tới giá trị 23. Những lần sau, khi sử dụng tên "x", ta sẽ lấy về giá trị 23:
print(x+2) # print 25
Bạn không cần phải quan tâm cách thức cài đặt cho cơ chế này, nhưng bạn có thể nghĩ nó như là một con trỏ trong ngôn ngữ C.
Để cho trực quan, tôi sử dụng hình minh họa bên dưới. Trong đó, hình chữ nhật màu xám là tên, với một mũi tên trỏ tới giá trị của nó. Ở đây, tên x tham chiếu tới giá trị 23:
Nhiều tên có thể tham chiếu tới cùng một giá trị
Python không giới hạn một giá trị chỉ có một tên gắn với nó, thay vào đó ta có thể gán nhiều tên tới cùng một giá trị.
x = 23 y = x
Cả x và y cùng tham chiếu tới giá trị 23:
Tên có thể được gán giá trị mới một cách độc lập
Tuy hai tên tham chiếu tới cùng giá trị nhưng không có liên kết nào giữa chúng. Vì vậy, ta có thể gán giá trị mới (tham chiếu tới giá trị khác) cho một tên mà không ảnh hưỏng đến tên khác:
x = 23 y = x x = 12 # Reassign name x
Nhìn vào hình trên, ta thấy gán lại giá trị cho x không ảnh hưỏng đến y.
Giá trị tồn tại cho đến khi không còn tên nào tham chiếu đến nó
Python lưu giữ số lượng tên tham chiếu tới một gía trị và tự động thu hồi bộ nhớ của giá trị đó khi không còn tham chiếu nào đến nó. Đây là bộ dọn rác tự động, bạn không cần phải tự mình xóa giá trị, chúng bị thu hồi tự động khi ta không cần đến nữa.
Câu lệnh gán
Đây là lưu ý quan trọng về câu lệnh gán:
Câu lệnh gán không sao chép dữ liệu
Khi giá trị có nhiều hơn một tên, ta rất hay nhầm lẫn về nó như là có hai tên và hai giá trị:
x = 23 y = x # Ta có 2 giá trị: x và y? # KHÔNG: ta chỉ có 2 tên và chỉ duy nhất 1 giá trị.
Việc gán một giá trị tới một tên không bao giờ copy dữ liệu, nó không tạo một giá trị mới. Phép gán khiến tên bên trái tham chiếu tới giá trị bên phải. Trong đoạn code trên, ta chỉ có duy nhất một giá trị 23, và x, y cả hai cùng trỏ tới nó.
Dynamic typing
Một số chi tiết về tên và giá trị:
Tên có thể tham chiếu tới bất kỳ giá trị tại bất kỳ thời điển nào
Python là ngôn ngữ có kiểu động, nghĩa rằng tên không có kiểu. Một tên có thể tham chiếu tới một số nguyên, nhưng sau đó là string, hàm và module.
x = 5 x = "Hello word" x = print
Tên không có kiểu và giá trị không có phạm vi (scope)
Khi ta nói một hàm trong Python có một biến cục bộ, nghĩa là tên được giới hạn trong phạm vi của hàm đó: Ta không thể sử dụng tên đó bên ngoài hàm và khi hàm trả về, tên bị xóa.
Nhưng như ta thấy, nếu giá trị (gán với tên) có những tham chiếu khác, thì giá trị đó sẽ vẫn tồn tại kể cả khi hàm trả về.
Kết luận
Hy vọng bài viết giúp bạn hiểu thêm về cơ chế làm việc của tên và giá trị trong Python.
nguồn: http://nedbatchelder.com/text/names.html