Truyền tham trị và tham biến trong Python
Trong Python, các đối tượng cơ bản như số, chuỗi, tuple là không thể thay đổi (immutable), trong khi các đối tượng như danh sách (list), từ điển (dictionary) và đối tượng (object) là có thể thay đổi (mutable).
Theo mặc định, Python sử dụng cơ chế “truyền tham trị”(Pass by value) cho các đối tượng không thể thay đổi, và “truyền tham biến” (Pass by reference) cho các đối tượng có thể thay đổi. Điều này có nghĩa là khi bạn truyền một đối tượng không thể thay đổi vào một hàm, hàm sẽ tạo một bản sao của đối tượng đó và sử dụng bản sao đó trong hàm, trong khi đối tượng gốc bên ngoài hàm không bị ảnh hưởng. Trong khi đó, khi bạn truyền một đối tượng có thể thay đổi vào một hàm, hàm sẽ sử dụng đối tượng gốc đó và các thay đổi trong hàm sẽ ảnh hưởng đến đối tượng gốc bên ngoài hàm.
Ví dụ:
def increment(x):
x += 1
y = 1
increment(y)
print(y) # output: 1
def append_element(lst, element):
lst.append(element)
my_list = [1, 2, 3]
append_element(my_list, 4)
print(my_list) # output: [1, 2, 3, 4]
Trong ví dụ đầu tiên, y là một số, là một đối tượng không thể thay đổi. Khi chúng ta gọi hàm increment với tham số y, Python tạo một bản sao của y và sử dụng bản sao đó trong hàm. Do đó, việc thay đổi giá trị của x trong hàm không ảnh hưởng đến giá trị của y bên ngoài hàm.
Trong ví dụ thứ hai, my_list là một danh sách, là một đối tượng có thể thay đổi. Khi chúng ta gọi hàm append_element với tham số my_list và 4, Python sử dụng đối tượng my_list gốc trong hàm. Do đó, việc thêm phần tử 4 vào lst trong hàm sẽ ảnh hưởng đến giá trị của my_list bên ngoài hàm.
Có một ví dụ khác, trong đó tham số được truyền theo tham biến và tham biến đó bị ghi đè trong hàm đã gọi.
def changeme(mylist):
mylist = [1,2,3,4]; # Điều này sẽ gán một tham chiếu mới trong mylist
print("Các giá trị bên trong hàm: ", mylist)
return
# Bây giờ bạn có thể gọi hàm changeme
mylist = [10,20,30]
changeme(mylist)
print("Các giá trị bên ngoài hàm: ", mylist)
Tham số mylist là cục bộ đối với hàm changeme. Thay đổi mylist trong hàm không ảnh hưởng đến mylist bên ngoài. Hàm không thực hiện bất cứ điều gì làm thay đổi giá trị của mylist bên ngoài và sẽ tạo ra kết quả sau:
Các giá trị bên trong hàm: [1, 2, 3, 4]
Các giá trị bên ngoài hàm: [10, 20, 30]
Bình luận