Hướng dẫn call by value and call by reference program in python - gọi theo giá trị và gọi theo chương trình tham chiếu trong python

Phạm vi của bài viết

Trong bài viết này, chúng tôi sẽ tìm hiểu những gì cuộc gọi theo giá trị và cuộc gọi bằng cách tham khảo có nghĩa chính xác trong ngôn ngữ lập trình Python, nhưng trước đó, trước tiên chúng tôi hãy hiểu những gì được gọi theo giá trị và gọi bằng cách tham khảo trong khi gọi một hàm.Call by Value and Call by reference while calling a function.

Gọi theo giá trị

Đó là một cách chuyển các đối số cho một hàm trong đó các đối số được sao chép vào các tham số chính thức của một hàm và được lưu trữ ở các vị trí bộ nhớ khác nhau. Nói tóm lại, bất kỳ thay đổi nào được thực hiện trong hàm không được phản ánh trong các tham số thực tế của hàm khi được gọi.passing arguments to a function in which the arguments get copied to the formal parameters of a function and are stored in different memory locations. In short, Any changes made within the function are not reflected in the actual parameters of the function when called.

Gọi bằng cách tham khảo

Đó là một cách chuyển các đối số cho một lệnh gọi hàm trong đó cả đối số thực tế và các tham số chính thức đều đề cập đến cùng một vị trí bộ nhớ và bất kỳ thay đổi nào được thực hiện trong hàm đều được phản ánh trong các tham số thực tế của hàm khi được gọi.passing arguments to a function call in which both the actual argument and formal parameters refer to the same memory locations and any changes made within the function are reflected in the actual parameters of the function when called.

Nếu chúng ta xem xét cuộc gọi theo giá trị và gọi bằng cách tham khảo bằng Python, thì chúng ta phải nhớ rằng,

Các biến Python không phải là các thùng chứa lưu trữ mà là các biến Python, giống như các tham chiếu bộ nhớ. Họ đề cập đến địa chỉ bộ nhớ nơi giá trị được lưu trữ.

Do đó, chúng ta nên biết về các đối tượng có thể thay đổi và bất biến.

Các đối tượng có thể thay đổi

Một đối tượng có trạng thái nội bộ có thể được thay đổi được gọi là một đối tượng có thể thay đổi. Ví dụ về các đối tượng có thể thay đổi là danh sách, bộ, từ điển, byte và mảng.Lists, Sets, Dictionaries, byte and array.

Các lớp do người dùng xác định có thể bị thay đổi hoặc bất biến, tùy thuộc vào trạng thái nội bộ của chúng có thể được thay đổi hay không.

Lưu ý- Tất cả các hoạt động sử dụng các đối tượng có thể thay đổi có thể hoặc không thể thay đổi đối tượng.- All operations using mutable objects may or may not change the object.

Đối tượng bất biến

Một đối tượng có trạng thái bên trong không thể thay đổi được gọi là một đối tượng bất biến. Ví dụ về các đối tượng bất biến là các số [int, float, bool, v.v.], chuỗi, bộ dữ liệu, bộ đông lạnh [phiên bản có thể thay đổi của các bộ được gọi là bộ đóng băng]

Lưu ý tất cả các hoạt động sử dụng các đối tượng bất biến tạo ra các bản sao.-All operations using immutable objects make copies.

Mã mã giải thích các đối tượng có thể thay đổi và bất biến

List1 = [2, 4, 6]
List2 = List1
List1.append[8] #Both List1 and List2 are changed
print ["New List 1 after append: ",List1]
print ["New List 2 after append: ",List2]
print["We see that changes are reflected in both List1 and List2"]
List1= List1 + [10]
print ["New List 1 after 10 is added",List1] #List 1 is changed
print ["New List2 after 10 is added to List1",List2] #List 2 remains same, since copy of List 1 is only made
print["When a new value is added to List 1, then List 2 remains the same since copy of List1 is made"]

Đầu ra và giải thích:


New List 1 after append:  [2, 4, 6, 8]
New List 2 after append:  [2, 4, 6, 8]
We see that changes are reflected in both List1 and List2[Mutable]
New List 1 after 10 is added [2, 4, 6, 8, 10]
New List2 after 10 is added to List1 [2, 4, 6, 8]
When a new value is added to List 1, then List 2 remains the same since copy of List1 is made and address of list 2 is different as it is **assigned** the value of List1.

Bây giờ chúng ta đã biết những đối tượng có thể thay đổi và bất biến là gì, hãy đi sâu vào những gì được gọi theo giá trị và gọi bằng cách tham khảo trong Python.

Gọi theo giá trị trong Python

Khi các đối tượng bất biến như toàn bộ số, chuỗi, vv được truyền dưới dạng đối số cho lệnh gọi hàm, nó có thể được coi là cuộc gọi theo giá trị.Immutable objects such as whole numbers, strings, etc are passed as arguments to the function call, it can be considered as Call by Value.

Điều này là do khi các giá trị được sửa đổi trong hàm, thì các thay đổi không được phản ánh bên ngoài hàm.

Ví dụ hiển thị cuộc gọi theo giá trị trong python


def myFunc[a]:
 print["\t Value received in 'a' =", a]
 a+=2
 print["\tValue of 'a' changes to :",a]
 
num=13
print["Initial number: ", num]
myFunc[num]
print["Value of number= ", num]

Output:


Initial number: 13
Value received in 'a'=13
Value of 'a' changes to: 15
Value of number=13

Giải thích: Như chúng ta có thể thấy ở đây giá trị của số đã thay đổi từ 13 thành 15 bên trong hàm nhưng bên ngoài hàm, giá trị của số vẫn còn 13. Do đó, các thay đổi không phản ánh trong giá trị được gán bên ngoài hàm. As we can see here value of the number changed from 13 to 15 inside the function but outside the function the value of the number remained 13 itself. Hence, the changes did not reflect in the value assigned outside the function.

Gọi bằng cách tham khảo trong Python

Khi các đối tượng có thể thay đổi như danh sách, dict, set, vv được truyền dưới dạng đối số cho cuộc gọi hàm, thì nó có thể được coi là cuộc gọi bằng cách tham chiếu trong Python. Điều này là do khi các giá trị được sửa đổi trong hàm thì thay đổi cũng được phản ánh bên ngoài hàm.Mutable objects such as list, dict, set, etc are passed as arguments to the function call, then it can be considered as Call by reference in Python. This is because when the values are modified within the function then the change also gets reflected outside the function.

Ví dụ 1 hiển thị cuộc gọi bằng cách tham khảo trong Python


def myFunc[myList]:
 print["\t List received: ",myList]
 myList.append[3]
 myList.extend[[7,1]]
 print["\t List after adding some elements:", myList]
 myList.remove[7]
 print["\t List within called function:", myList]
 return
 
List1=[1]
print["List before function call :",List1]
myFunc[List1]
print["\t List after function call: ",List1]

Output:


List before function call: [1]
List received: [1]
List after adding some elements:[1, 3, 7, 1]
List within called function:[1, 3, 1]
List after function call: [1, 3, 1]

Giải thích: Ở đây chúng ta có thể thấy rõ rằng giá trị danh sách trong hàm đã được thay đổi từ [1] thành [1, 3, 1] và các thay đổi cũng được phản ánh bên ngoài chức năng. Here we can clearly see that the list value within the function got changed from [1] to [1, 3, 1] and the changes got reflected outside the function as well.

Nhưng, hãy xem xét ví dụ này-

Ví dụ 1 hiển thị cuộc gọi bằng cách tham khảo trong Python


def myFunc[myList]:
 print["\t List received: ",myList]
 myList.append[3]
 myList.extend[[7,1]]
 print["\t List after adding some elements:", myList]
 myList.remove[7]
 myList=[3, 4, 6]
 print["\t List within called function:", myList]
 return
 
List1=[1]
print["List before function call :",List1]
myFunc[List1]
print["\t List after function call: ",List1]

Output:


List before function call : [1]
	 List received:  [1]
	 List after adding some elements: [1, 3, 7, 1]
	 List within called function: [3, 4, 6]
	 List after function call:  [1, 3, 1]

Giải thích: Ở đây chúng ta có thể thấy rõ rằng giá trị danh sách trong hàm đã được thay đổi từ [1] thành [1, 3, 1] và các thay đổi cũng được phản ánh bên ngoài chức năng.myList but after the function call, we see that all the changes do not get reflected outside the function.

Nhưng, hãy xem xét ví dụ này-

Không giống như ví dụ trước ở trên, các giá trị mới được gán cho Mylist nhưng sau khi gọi hàm, chúng tôi thấy rằng tất cả các thay đổi không được phản ánh bên ngoài hàm.

Sau đó, nó có gọi bằng cách tham khảo không?

def myFunc[myList]:
 print["\t List received: ",myList]
 myList.append[3]
 myList.extend[[7,1]]
 print["\t List after adding some elements:", myList]
 myList.remove[7]
 print["Address within function:"]
 print[[id[myList]]]
 print["\t List within called function:", myList]
 return
 
List1=[1]
print["Address before calling:",[id[List1]]]
print["List before function call :",List1]
myFunc[List1]
print["\t List after function call: ",List1]
print["Address after calling:",[id[List1]]]

Output:


Address before calling: 139686125231424
List before function call : [1]
	 List received:  [1]
	 List after adding some elements: [1, 3, 7, 1]
Address within function:
139686125231424
	 List within called function: [1, 3, 1]
List after function call:  [1, 3, 1]
Address after calling: 139686125231424

Chúng ta hãy xem xét môi trường bộ nhớ cho cả hai ví dụ. Chúng tôi sẽ in địa chỉ của danh sách trước khi gọi chức năng và sau khi gọi chức năng. Here we see the value of the list before calling the function, within the function and after calling the function gets stored in the same memory address. Hence, changes made within function gets reflected outside the function as well.

Ví dụ 1


New List 1 after append:  [2, 4, 6, 8]
New List 2 after append:  [2, 4, 6, 8]
We see that changes are reflected in both List1 and List2[Mutable]
New List 1 after 10 is added [2, 4, 6, 8, 10]
New List2 after 10 is added to List1 [2, 4, 6, 8]
When a new value is added to List 1, then List 2 remains the same since copy of List1 is made and address of list 2 is different as it is **assigned** the value of List1.
0

Output:


New List 1 after append:  [2, 4, 6, 8]
New List 2 after append:  [2, 4, 6, 8]
We see that changes are reflected in both List1 and List2[Mutable]
New List 1 after 10 is added [2, 4, 6, 8, 10]
New List2 after 10 is added to List1 [2, 4, 6, 8]
When a new value is added to List 1, then List 2 remains the same since copy of List1 is made and address of list 2 is different as it is **assigned** the value of List1.
1

Giải thích: Ở đây chúng tôi thấy giá trị của danh sách trước khi gọi hàm, trong hàm và sau khi gọi hàm, chức năng được lưu trữ trong cùng một địa chỉ bộ nhớ. Do đó, những thay đổi được thực hiện trong chức năng cũng được phản ánh bên ngoài chức năng. Here we see that, the address of the list changes when new values are assigned to it within the function but outside the function, the value still refers to the previous memory allocation. Hence, the changes made within the function do not get reflected outside the function.

Hãy xem xét ví dụ 2 ngay bây giờ: Well, we see that when mutable objects are passed as arguments to a function then there are two cases:

Giải thích: Ở đây chúng ta thấy rằng, địa chỉ của danh sách thay đổi khi các giá trị mới được gán cho nó trong hàm nhưng bên ngoài hàm, giá trị vẫn đề cập đến phân bổ bộ nhớ trước đó. Do đó, những thay đổi được thực hiện trong hàm không được phản ánh bên ngoài chức năng.Change is reflected outside function This is when a mutable object is passed as an argument and no new value is assigned to it, ie., the values refer to the same memory address.

Chúng ta suy ra điều gì? Chà, chúng ta thấy rằng khi các đối tượng có thể thay đổi được truyền dưới dạng đối số cho một hàm thì có hai trường hợp:Change is not reflected outside function This is when a mutable object is passed as an argument and new values or datatype is assigned to it within the function, ie. when the values outside the function and the values assigned within function refer to different memory addresses.

Note:

Trong Python, các thay đổi về giá trị trước và sau khi gọi hàm chỉ phụ thuộc vào địa chỉ bộ nhớ. Có tham chiếu đối tượng tùy thuộc vào môi trường bộ nhớ. Các đối số được thông qua bằng cách chuyển nhượng trong Python. Vì bài tập chỉ tạo ra các tham chiếu đến các đối tượng, nên không có bí danh nào giữa một tên đối số trong người gọi và callee.

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

Gọi theo giá trịGọi bằng cách tham khảo
1. Các đối số được sao chép vào tham số chức năng.Các đối số, cũng như các tham số chính thức đề cập đến cùng một vị trí.same location.
2. Những thay đổi được thực hiện không được phản ánh.Những thay đổi được thực hiện bên trong các chức năng được phản ánh.
3. Các đối tượng bất biến được truyền trong các đối số.Immutable Objects are passed in arguments . Các đối tượng có thể thay đổi được thông qua trong các đối số.

Sự kết luận

Tóm lại,

  • Tùy thuộc vào khả năng đột biến/tính bất biến của kiểu dữ liệu của nó, một biến hoạt động khác nhau.
  • Nếu một biến đang đề cập đến một loại bất biến, thì bất kỳ thay đổi nào về giá trị của nó cũng sẽ thay đổi địa chỉ bộ nhớ mà nó đề cập, nhưng nếu một biến được đề cập đến một loại có thể thay đổi thì bất kỳ thay đổi nào về giá trị của loại có thể thay đổi sẽ không thay đổi bộ nhớ địa chỉ của biến.
  • Các đối số được thông qua bằng cách chuyển nhượng trong Python. Bài tập chỉ tạo ra các tham chiếu đến các đối tượng.
  • Do đó, các đối tượng bất biến được truyền dưới dạng các đối số được gọi là trong cuộc gọi theo giá trị và các đối tượng có thể thay đổi, khi được truyền dưới dạng đối số được gọi là cuộc gọi theo tham chiếu.Call by Value and Mutable objects, when passed as arguments are referred as Call by Reference.

Nhấn vào đây, để biết thêm về mức độ [] trong Python.

Cuộc gọi theo giá trị và gọi bằng cách tham khảo trong Python là gì?

Trong cuộc gọi theo giá trị, một tham số hoạt động trong hàm như một biến cục bộ mới được khởi tạo thành giá trị của đối số [một bản sao cục bộ [bị cô lập] của đối số]. Trong cuộc gọi bằng tham chiếu, biến đối số do người gọi cung cấp có thể bị ảnh hưởng bởi các hành động trong hàm được gọi.

Cuộc gọi theo giá trị và gọi bằng cách tham khảo với chương trình 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 quá trình gọi hàm, nó 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 bằng tham chiếu, khi chúng tôi chuyển tham chiếu/địa chỉ vị trí của tham số, nó sao chép và gán chúng cho đối số cục bộ của hàm.

Gọi theo giá trị với ví dụ trong Python là gì?

Gọi theo giá trị trong Python Khi các đối tượng bất biến như toàn bộ số, chuỗi, v.v. được truyền dưới dạng đối số cho cuộc gọi hàm, nó có thể được coi là cuộc gọi theo giá trị.Điều này là do khi các giá trị được sửa đổi trong hàm, thì các thay đổi không được phản ánh bên ngoài hàm.When Immutable objects such as whole numbers, strings, etc are passed as arguments to the function call, it can be considered as Call by Value. This is because when the values are modified within the function, then the changes do not get reflected outside the function.

Cuộc gọi bằng cách tham khảo trong lập trình là gì?

Cuộc gọi bằng phương thức tham chiếu chuyển các đối số đến một hàm sao chép địa chỉ của một đối số vào tham số chính thức.Bên trong hàm, địa chỉ được sử dụng để truy cập đối số thực tế được sử dụng trong cuộc gọi.Nó có nghĩa là những thay đổi được thực hiện cho tham số ảnh hưởng đến đối số được thông qua.copies the address of an argument into the formal parameter. Inside the function, the address is used to access the actual argument used in the call. It means the changes made to the parameter affect the passed argument.

Bài Viết Liên Quan

Chủ Đề