Gọi theo giá trị và Gọi theo tham chiếu Python là gì?

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ì

Gọi theo giá trị và gọi theo tham chiếu trong ví dụ Python là gì?

Sự khác biệt giữa Gọi theo giá trị và Gọi theo tham chiếu

Sự khác biệt giữa cuộc gọi theo giá trị và cuộc gọi theo tham chiếu trong Python là gì?

Trong trường hợp Gọi theo giá trị, khi chúng ta chuyển giá trị của tham số trong khi gọi hàm, nó sẽ sao chép chúng vào đối số cục bộ thực tế của hàm. Trong trường hợp Gọi theo tham chiếu, khi chúng ta chuyển địa chỉ/tham chiếu vị trí của tham số, nó sẽ sao chép và gán chúng cho đối số cục bộ của hàm

Gọi theo giá trị và tham chiếu là gì?

Gọi theo Giá trị có nghĩa là gọi một phương thức có tham số là giá trị. Thông qua đó, giá trị đối số được chuyển đến tham số. Trong khi Gọi theo tham chiếu có nghĩa là gọi một phương thức có tham số làm tham chiếu. Thông qua đó, tham chiếu đối số được chuyển đến tham số

Python theo tham chiếu hay theo giá trị?

Python truyền các đối số không phải theo tham chiếu hay theo giá trị mà theo phép gán.

Chủ Đề