Trong bài viết này, chúng ta đã khám phá cách truyền một biến bằng cách tham chiếu đến một hàm trong Python. Chúng tôi đã chứng minh ý tưởng bằng các đoạn mã Python
Có hai kiểu truyền tham số cho hàm trong Python
- Vượt qua giá trị
- Vượt qua tham chiếu
Vượt qua giá trị
Một bản sao của đối số được truyền cho hàm được tạo và khi bất kỳ thao tác nào được thực hiện trên bản sao, giá trị thực không thay đổi. Nó chỉ thay đổi giá trị của bản sao được tạo bên trong hàm
def fun[a]:
a+=10
print["Inside function call",a]
a=20
print["Before function call",a]
fun[a]
print["After function call",a]
đầu ra
Before function call 20
Inside function call 30
After function call 20
Giải trình
Tại đây, một bản sao của đối số được tạo và các thay đổi được thực hiện đối với bản sao đó để nó không ảnh hưởng đến giá trị ban đầu. Vì vậy, sau khi gọi hàm, nó sẽ in giá trị ban đầu
Vượt qua tham chiếu
Trong phần này, tham chiếu đến đối số gốc được truyền và khi bất kỳ thao tác nào được thực hiện trên đối số, giá trị thực cũng thay đổi. Nó thay đổi giá trị trong cả chức năng và trên toàn cầu
def fun[a]:
a.append['i']
print["Inside function call",a]
a=['H']
print["Before function call",a]
fun[a]
print["After function call",a]
đầu ra
Before function call ['H']
Inside function call ['H', 'i']
After function call ['H', 'i']
Giải trình
Ở đây, khi một danh sách được sử dụng, tham chiếu của nó được chuyển vào hàm khi có bất kỳ thay đổi nào được thực hiện đối với danh sách, hiệu ứng của nó được hiển thị ngay cả sau khi gọi hàm
Ví dụ dưới đây đưa ra lời giải thích chi tiết về cả hai
Python thực sự sử dụng Gọi theo tham chiếu đối tượng còn được gọi là Gọi theo chuyển nhượng, điều đó có nghĩa là nó phụ thuộc vào loại đối số được truyền
- Nếu các đối tượng bất biến được truyền thì nó sử dụng Gọi theo giá trị
- Nếu các đối tượng có thể thay đổi được truyền thì nó sử dụng Gọi theo tham chiếu
Đối tượng bất biến
Các đối tượng này không thể thay đổi trạng thái hoặc giá trị của chúng. Các loại đối tượng bất biến khác nhau là
- Sợi dây
- số nguyên
- Tuple
def fun[s,num,d]:
s="Hello"
num=10
d=[5,6,7]
print["Inside function call",s,num,d]
s="Opengenus"
num=1
d=[1,2,3]
print["Before function call",s,num,d]
fun[s,num,d]
print["After function call",s,num,d]
đầu ra
Before function call Opengenus 1 [1, 2, 3]
Inside function call Hello 10 [5, 6, 7]
After function call Opengenus 1 [1, 2, 3]
Giải trình
Mặc dù các giá trị của s,num,d được thay đổi bên trong hàm nhưng giá trị ban đầu không bị thay đổi khi chúng được truyền theo giá trị. Do đó, nó in cùng một giá trị ngay cả sau khi gọi hàm
Đối tượng có thể thay đổi
Các đối tượng này có thể thay đổi trạng thái hoặc giá trị của chúng. Các loại đối tượng có thể thay đổi khác nhau là
- Danh sách
- Từ điển
- Bộ
def fun[s,num,d]:
s.append[5]
num["name"]="harry"
d|=set[{1,2}]
print["Inside function call",s,num,d]
s=[1,2,4]
num={"name":"john"}
d={4,5,6}
print["Before function call",s,num,d]
fun[s,num,d]
print["After function call",s,num,d]
Giải trình
Ở đây, các đối tượng có thể thay đổi như từ điển, danh sách, tập hợp được truyền vào hàm và các giá trị của chúng được sửa đổi trong đó. Sau khi gọi hàm, giá trị ban đầu được cập nhật với giá trị mới
Truyền đối tượng bất biến theo tham chiếu
Như đã đề cập trước đó, bất cứ khi nào đối tượng bất biến được chuyển đến một hàm, nó sẽ được chuyển dưới dạng gọi theo giá trị. Nhưng hành vi này có thể được thay đổi bằng một số cách khác nhau như sau
Trả lại và chỉ định lại
Theo cách tiếp cận này, giá trị được thay đổi trong hàm được gọi và sau đó được trả về. Giá trị trả về này được gán cho biến ban đầu
def ref[s]:
s+="Opengenus"
return s
s="Hello "
print["Before passing to function -",s]
s=ref[s]
print["After passing to function -",s]
đầu ra
Trước khi chuyển sang chức năng - Xin chào
Sau khi chuyển sang chức năng - Xin chào Opengenus
Giải trình
Ở đây, chuỗi được sửa đổi trong hàm ref[] và được trả về. Giá trị trả về này được gán lại cho biến "s" để nó chứa giá trị đã sửa đổi
Sử dụng từ khóa Class và self
Theo cách này, từ khóa self được sử dụng để truy cập các biến thể hiện trong một lớp
________số 8_______đầu ra
Trước khi gọi hàm 1
Sau khi gọi chức năng 2
Giải trình
Ở đây, biến thể hiện val được thay đổi bên trong hàm modify[]. Vì biến thể hiện được gán lại giá trị nên sau khi gọi hàm, giá trị ban đầu sẽ bị thay đổi
Truyền các đối tượng không thể thay đổi bên trong Từ điển hoặc Danh sách
Các đối tượng không thể thay đổi được truyền bên trong các đối tượng có thể thay đổi như từ điển hoặc danh sách hoặc đặt làm tham số cho hàm để chúng có thể được sửa đổi trong hàm
def change_dict[d]:
d["hello"]="First Article"
def change_list[l]:
l[0]=l[0]+5
d={"hello":"opengenus"}
l=[5]
print["Before passing to function values are "]
print["Dictionary - ",d]
print["List -",l]
change_dict[d]
change_list[l]
print["After passing to function values are "]
print["Dictionary - ",d]
print["List -",l]
đầu ra
Trước khi chuyển đến các giá trị hàm là
Từ điển - {'xin chào'. 'opengenus'}
Danh sách - [5]
Sau khi chuyển đến các giá trị hàm là
Từ điển - {'xin chào'. 'Bài viết đầu tiên'}
Danh sách - [10]
Hãy xem xét mã Python sau đây cho một câu hỏi thú vị
Before function call 20
Inside function call 30
After function call 20
0Câu hỏi
Đầu ra của đoạn mã trên
Với đối số 10;
Với đối số 20;
Với đối số 12;
Không có điều nào ở trên
Ban đầu 10 được gửi làm đối số cho lớp và 10 được thêm vào và khi đối số không được gửi, 2 được khởi tạo và 10 được thêm lại