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ù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

)

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:

Ned Batchelder  Facts and myths about Python names and values.png

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:

Ned Batchelder  Facts and myths about Python names and values(1).png

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

Ned Batchelder  Facts and myths about Python names and values(2).png

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

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