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

Đó là một cách truyền đố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 hàm và được lưu trữ ở các vị trí bộ nhớ khác nhau. Nói tóm lại, mọi thay đổi được thực hiện trong hàm không được phản ánh trong các tham số thực của hàm khi được gọi

Đó là một cách truyền đối số cho lệnh gọi hàm trong đó cả đối số thực và tham số chính thức đều tham chiếu đế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 của hàm khi được gọi

Nếu chúng ta xem xét gọi theo giá trị và gọi theo tham chiếu trong Python, thì chúng ta phải ghi nhớ rằng,

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

Do đó, chúng ta nên biết về Mutable và Immutable Objects

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

Một đối tượng có thể thay đổi trạng thái bên trong đượ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

Các lớp do người dùng định nghĩa có thể thay đổi hoặc không thay đổi, tùy thuộc vào việc trạng thái bên trong của chúng có thể thay đổi được hay không

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

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

Gọi theo giá trị trong Python

Khi các đối tượng Bất biến như số nguyên, chuỗi, v.v. được truyền dưới dạng đối số cho lệnh gọi hàm, nó có thể được coi là Gọi theo Giá trị

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

Ví dụ hiển thị 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]

đầu ra


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

Giải trình. 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 là 13. Do đó, những thay đổi không phản ánh trong giá trị được gán bên ngoài chức năng

Khi các đối tượng có thể thay đổi như list, dict, set, v.v. được truyền dưới dạng đối số cho lệnh gọi hàm, thì nó có thể được coi là Gọi theo 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

Ví dụ 1 hiển thị Gọi theo tham chiếu 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]

đầu ra


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 trình. Ở đây chúng ta có thể thấy rõ rằng giá trị danh sách bên trong hàm đã thay đổi từ [1] thành [1, 3, 1] và những thay đổi này cũng được phản ánh bên ngoài hàm

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

Ví dụ 1 hiển thị Gọi theo tham chiếu 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]

đầu ra


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]

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ó phải là Gọi theo tham chiếu không?

Hãy xem xét môi trường bộ nhớ cho cả hai ví dụ. Ta sẽ in địa chỉ của danh sách trước khi gọi hàm và sau khi gọi hàm

ví dụ 1

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]]]

đầu ra


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

Giải trình. Ở đây chúng ta 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 đượ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

Hãy xem xét Ví dụ 2 ngay bây giờ

________số 8

đầu ra


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

Giải trình. Ở đâ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ó bên trong hàm nhưng bên ngoài hàm, giá trị vẫn đề cập đến việc cấp phát 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 hàm

Chúng ta suy ra điều gì?

a. ] Thay đổi được phản ánh bên ngoài hàm Đây là khi một đối tượng có thể thay đổi được truyền dưới dạng đối số và không có giá trị mới nào được gán cho nó, nghĩa là. , các giá trị tham chiếu đến cùng một địa chỉ bộ nhớ

b. ] Thay đổi không được phản ánh bên ngoài hàm Đây là khi một đối tượng có thể thay đổi được truyền dưới dạng đối số và các giá trị hoặc kiểu dữ liệu mới được gán cho nó trong hàm, nghĩa là. khi các giá trị bên ngoài hàm và các giá trị được gán bên trong hàm tham chiếu đến các địa chỉ bộ nhớ khác nhau

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

Gọi theo ValueCall theo Reference1. 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í. 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. Đối tượng bất biến được truyền vào đối số. Các đối tượng có thể thay đổi được truyền vào đối số

Có phải Python luôn chuyển qua tham chiếu không?

Python luôn sử dụng các giá trị chuyển qua tham chiếu . Không có bất kỳ ngoại lệ. Bất kỳ phép gán biến nào có nghĩa là sao chép giá trị tham chiếu.

Python có phải là biến tham chiếu không?

Biến Python là tên tượng trưng tham chiếu hoặc con trỏ tới đối tượng . Khi một đối tượng được gán cho một biến, bạn có thể gọi đối tượng bằng tên đó. Nhưng bản thân dữ liệu vẫn được chứa trong đối tượng.

Các danh sách trong Python có được chuyển theo tham chiếu hoặc giá trị không?

Mô hình truyền đối số của Python không phải là “Truyền theo giá trị” hay “Truyền theo tham chiếu” mà là “ Truyền theo tham chiếu đối tượng ”.

Python có hoạt động với tham chiếu không?

Chương trình Python truy cập giá trị dữ liệu thông qua tham chiếu . Tham chiếu là tên đề cập đến vị trí cụ thể trong bộ nhớ của một giá trị [đối tượng]. Tham chiếu có dạng biến, thuộc tính và mục.

Chủ Đề