Trong ví dụ trên, giá trị của biến a và b không được sửa đổi vì bản sao của a,b được chuyển thay vì địa chỉ của chúng
- Gọi theo tham chiếu. - Trong Gọi theo tham chiếu, địa chỉ [biến thực] của biến được truyền vào lời gọi hàm dưới dạng tham số thực
Vì vậy, nếu bất kỳ sửa đổi nào được áp dụng cho các tham số chức năng, nó sẽ được phản ánh trên biến thực tế. **
Ví dụ. -
#include
void call_by_reference[int *a , int *b]{
*a = 44;
*b = 55;
}
int main[] {
int a = 1;
int b = 2;
printf["value of a and b before function call :- %d and %d",a,b];
call_by_reference[&a, &b];
printf["\nvalue of a and b after function call :- %d and %d",a,b];
return 0;
}
Output :-
value of a and b before function call :- 1 and 2
value of a and b after function call :- 44 and 55
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Trong ví dụ trên, địa chỉ của biến a và b sử dụng & theo sau là tên biến, trong đó trong định nghĩa hàm
* tham số theo sau được gọi là biến con trỏ được sử dụng
to storing addresses, because of this values in varible a and b is modified.
Bây giờ chúng ta đã thấy cuộc gọi theo giá trị và cuộc gọi theo tham chiếu là gì với ví dụ
Nhưng, ngôn ngữ lập trình Python sử dụng cơ chế gọi theo đối tượng và cũng gọi theo tham chiếu đối tượng
Mỗi đối tượng bất cứ khi nào nó được khởi tạo, nó được gán id duy nhất và loại của nó nếu được xác định trong thời gian chạy và id[đối tượng] trả về một danh tính duy nhất [giá trị nguyên] của đối tượng đó
để đi sâu hơn vào chủ đề trước tiên chúng ta phải hiểu đối tượng có thể thay đổi và đối tượng không thể thay đổi trong python
Đối tượng có thể thay đổi
Kiểu dữ liệu có thể sửa đổi hoặc nếu có thể thay đổi trạng thái, những đối tượng đó được gọi là kiểu dữ liệu có thể thay đổi
như [danh sách, từ điển, .Đối tượng bất biến
Kiểu dữ liệu không thể sửa đổi hoặc nếu không thể thay đổi trạng thái thì những đối tượng đó được gọi là kiểu dữ liệu Bất biến như **[int, float, bool, string, unicode, tuple .
Vì vậy, khi các đối tượng có thể thay đổi được chuyển đến lệnh gọi hàm thì nó được coi là ** gọi theo giá trị. **
Và khi các đối tượng Bất biến được chuyển đến lệnh gọi hàm và có giá trị được sửa đổi thì nó được coi là ** gọi theo tham chiếu. **
Để đơn giản, chúng ta sẽ sử dụng từ gọi theo giá trị và gọi theo tham chiếu thay vì [gọi theo đối tượng] và [gọi theo tham chiếu đối tượng] một cách tương ứng
hãy lấy ví dụ để gọi theo tham chiếu và gọi theo giá trị
Ví dụ. - Gọi theo tham chiếu [với các đối tượng Immutable [int, float, bool, string] và không thay đổi trạng thái đối tượng] trong python
num1 = 43
num2 = 12.44
num3 = False
name = 'hello'
print["Id in main function scope"]
print[f"id of num1 = {id[num1]}"]
print[f"id of num2 = {id[num2]}"]
print[f"id of num2 = {id[num3]}"]
print[f"id of name = {id[name]}"]
def call_by_reference[num1,num2,num3,name]:
print["\nId within function"]
print[f"id of num1 = {id[num1]}"]
print[f"id of num2 = {id[num2]}"]
print[f"id of num2 = {id[num3]}"]
print[f"id of name = {id[name]}"]
call_by_reference[num1,num2,num3,name]
Output :-
Id in main function scope
id of num1 = 94157957099328
id of num2 = 140438713493200
id of num2 = 94157956423968
id of name = 140438848940272
Id within function
id of num1 = 94157957099328
id of num2 = 140438713493200
id of num2 = 94157956423968
id of name = 140438848940272
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Vì vậy, chúng ta có thể thấy rằng id của các đối tượng [num1, num2, num3] không thay đổi vì chưa áp dụng sửa đổi cho các đối tượng đó
Ví dụ. - Gọi theo tham chiếu [với các đối tượng có thể thay đổi [danh sách, dict] và trạng thái đối tượng được sửa đổi] trong python
names = ['ram', 'shyam', 'bharat']
d = {'bob':21,'max':22}
print["Id in main function scope"]
print[f"id of names list = {id[names]}"]
print[f"id of d dict = {id[d]}"]
def call_by_reference[name, d]:
print["Id within function"]
d['sam'] = 12
names.append['john']
print["\nModified Objects id :-"]
print[f"id of names list = {id[names]}"]
print[f"id of d dict = {id[d]}"]
call_by_reference[names, d]
print["Modfied list and dict"]
print[f"names = {names}"]
print[f"dict = {d}"]
Output :-
Id in main function scope
id of names list = 140439297460096
id of d dict = 140438712179600
Id within function
Modified Objects id :-
id of names list = 140439297460096
id of d dict = 140438712179600
Modfied list and dict
names = ['ram', 'shyam', 'bharat', 'john']
dict = {'bob': 21, 'max': 22, 'sam': 12}
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Chúng ta có thể thấy ngay cả sau khi sửa đổi trạng thái đối tượng, id của đối tượng vẫn không thay đổi vì kiểu dữ liệu của đối tượng là đối tượng có thể thay đổi ở đây bởi ,ngay cả khi trạng thái đối tượng được sửa đổi
nó được xử lý .
=============================================================
Ví dụ. - Gọi theo Giá trị [với các đối tượng Bất biến [int, float, bool, string] và trạng thái đối tượng đã sửa đổi] trong python
num1 = 43
num2 = 12.44
num3 = False
name = 'hello'
print["Id in main function scope"]
print[f"id of num1 = {id[num1]}"]
print[f"id of num2 = {id[num2]}"]
print[f"id of num2 = {id[num3]}"]
print[f"id of name = {id[name]}"]
def call_by_value[num1,num2,num3,name]:
print["\nId within function"]
num1 = 1
num2 = 2
num3 = 3
name = 'sam'
print["Modified Objects id"]
print[f"id of num1 = {id[num1]}"]
print[f"id of num2 = {id[num2]}"]
print[f"id of num2 = {id[num3]}"]
print[f"id of name = {id[name]}"]
call_by_value[num1,num2,num3,name]
print["\Unmodified int, float, bool, string objects value in global scope"]
print[f'num1 = {num1}']
print[f'num2 = {num2}']
print[f'num3 = {num3}']
Output :-
Id in main function scope
id of num1 = 94157957099328
id of num2 = 140438713494320
id of num2 = 94157956423968
id of name = 140438848940272
Id within function
Modified Objects id
id of num1 = 94157957097984
id of num2 = 94157957098016
id of num2 = 94157957098048
id of name = 140438713157936
Unmodified int, float, bool, string objects value in global scope
num1 = 43
num2 = 12.44
num3 = False
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Trong ví dụ trên, chúng ta có thể thấy rằng sau khi sửa đổi các đối tượng Immuatable, id của đối tượng là khác nhau, điều này là do chúng ta không thể sửa đổi giá trị của Immutables và vì 3 đối tượng mới này có tên [num1, num2, num3, name] được tạo trong
Ví dụ. - Gọi theo Giá trị [với các đối tượng Bất biến [tuple] và trạng thái đối tượng được sửa đổi] trong python
names = ['ram', 'shyam', 'bharat']
print["Id in main function scope"]
print[f"id of names tuple = {id[names]}"]
def call_by_value[name, d]:
print["Id within function"]
names = ['ram','shyam','bharat','john']
print[f"modified object value \n{names}"]
print["\nModified Objects id :-"]
print[f"id of names tuple = {id[names]}"]
call_by_value[names, d]
print["\nUnchanged tuple object in global scope"]
print[f"names = {names}"]
Output :-
Id in main function scope
id of names tuple = 140438712974144
Id within function
modified object value
['ram', 'shyam', 'bharat', 'john']
Modified Objects id :-
id of names tuple = 140438712255888
Unchanged tuple object in global scope
names = ['ram', 'shyam', 'bharat']
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Trong ví dụ trên, chúng ta có thể đã gán một bộ dữ liệu mới có cùng các phần tử + thêm một phần tử bởi vì [kiểu dữ liệu bộ dữ liệu không hỗ trợ bất kỳ phương thức thêm nào] và kiểm tra id đối tượng khác vì một đối tượng mới được tạo và đối tượng toàn cục cũng không thay đổi vì