Python có vượt qua tham chiếu không?

Trong C, Java và một số ngôn ngữ khác, chúng tôi chuyển giá trị cho một hàm theo giá trị hoặc theo tham chiếu được biết đến rộng rãi là “Truyền/Gọi theo giá trị” và “Truyền/Gọi theo tham chiếu”

Gọi/Truyền theo giá trị

Trong truyền theo giá trị, hàm nhận một bản sao của các đối tượng đối số được người gọi truyền cho nó, được lưu trữ ở một vị trí mới trong bộ nhớ

Bạn chuyển các giá trị của tham số cho hàm, nếu có bất kỳ loại thay đổi nào được thực hiện đối với các tham số đó bên trong hàm, thì những thay đổi đó không được phản ánh lại trong các tham số thực tế của bạn

Gọi theo tham chiếu

Trong tham chiếu truyền qua, hàm nhận tham chiếu đến các đối tượng đối số được người gọi truyền cho nó, cả hai đều trỏ đến cùng một vị trí bộ nhớ

bạn chuyển tham chiếu tham số cho hàm của mình. nếu có bất kỳ thay đổi nào được thực hiện đối với các tham số đó bên trong hàm thì những thay đổi đó sẽ được phản ánh trở lại các tham số thực tế của bạn

Trong Python Cả hai khái niệm này đều không thể áp dụng được, thay vào đó, các giá trị được gửi đến các hàm bằng tham chiếu đối tượng

Tham chiếu theo đối tượng

Trong Python, [gần như] mọi thứ đều là đối tượng. Cái mà chúng ta thường gọi là "biến" trong Python được gọi đúng hơn là tên. Tương tự như vậy, "chuyển nhượng" thực sự là sự ràng buộc của một tên đối với một đối tượng. Mỗi ràng buộc có một phạm vi xác định khả năng hiển thị của nó, thường là khối mà tên bắt nguồn

Trong Python, các giá trị được truyền cho hàm theo tham chiếu đối tượng

nếu đối tượng là bất biến [không thể sửa đổi] thì giá trị đã sửa đổi không có sẵn bên ngoài chức năng

Tất cả các tham số [đối số] trong ngôn ngữ Python đều được truyền theo tham chiếu. Điều đó có nghĩa là nếu bạn thay đổi tham số đề cập đến trong một hàm, thì thay đổi đó cũng phản ánh lại trong hàm gọi

Ví dụ

Bản thử trực tiếp

#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist.append[[1,2,3,4]];
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist

đầu ra

Ở đây, chúng tôi đang duy trì tham chiếu của đối tượng đã truyền và các giá trị nối thêm trong cùng một đối tượng. Vì vậy, điều này sẽ tạo ra kết quả sau -

Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]

Có một ví dụ nữa trong đó đối số được truyền theo tham chiếu và tham chiếu đang bị ghi đè bên trong hàm được gọi

Ví dụ

Bản thử trực tiếp

#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist

đầu ra

Tham số mylist là cục bộ của hàm changeme. Thay đổi danh sách của tôi trong chức năng không ảnh hưởng đến danh sách của tôi. Hàm này không hoàn thành gì và cuối cùng, điều này sẽ tạo ra kết quả sau -

Các nhà phát triển chuyển sang lập trình Python từ các ngôn ngữ khác như C ++ và Java thường bị nhầm lẫn bởi quá trình truyền đối số trong Python. Mô hình dữ liệu lấy đối tượng làm trung tâm và cách xử lý phân công của nó là nguyên nhân đằng sau sự nhầm lẫn ở cấp độ cơ bản.  

Trong bài viết này, chúng ta sẽ thảo luận về khái niệm về cách truyền giá trị theo tham chiếu trong Python và cố gắng hiểu các ví dụ về truyền tham chiếu trong Python

Truyền theo giá trị và truyền theo tham chiếu trong Python

Bạn có thể muốn đấm một cái gì đó sau khi đọc trước, vì vậy hãy chuẩn bị tinh thần. 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”.  

Có thể hiểu các mô hình “Truyền theo giá trị”, “Truyền theo tham chiếu” và “Truyền theo tham chiếu đối tượng” bằng cách khám phá các hàm ví dụ dưới đây. Nhìn vào hai chức năng được xác định dưới đây

Python3




Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
4
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
5
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
6
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
7

Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
8
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
6
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
0
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
1
 a = ["X", "Y"]
0
 a = ["X", "Y"]
1
 a = ["X", "Y"]
2
 a = ["X", "Y"]
1
 a = ["X", "Y"]
4
 a = ["X", "Y"]
5

Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
8
 a = ["X", "Y"]
7
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
6

 

Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
4
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
40
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
6
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
7

Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
8
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
6
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
45
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
46
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
47

Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
8
 a = ["X", "Y"]
7
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
6

 

Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
51
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
0
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
1____154
 a = ["X", "Y"]
5

 

Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
56____157

 

Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
56____159

đầu ra

Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
2

Bây giờ, hãy cùng khám phá đoạn mã trên,

Biến không phải là đối tượng

Ở đây “a” là một biến trỏ đến một danh sách chứa phần tử “X” và “Y”. Nhưng bản thân “a” không phải là danh sách. Coi “a” là một nhóm chứa đối tượng “X” và “Y”.  

 a = ["X", "Y"]

 

Pass by Reference trong Python là gì?

Truyền theo tham chiếu có nghĩa là bạn phải truyền hàm [tham chiếu] cho một biến chỉ rằng biến đó đã tồn tại trong bộ nhớ.  

Ở đây, biến [cái xô] được truyền trực tiếp vào hàm. Biến hoạt động như một Gói đi kèm với nội dung của nó [các đối tượng]

 

Trong hình ảnh mã ở trên, cả “list” và “my_list” đều là cùng một biến vùng chứa và do đó đề cập đến cùng một đối tượng chính xác trong bộ nhớ. Bất kỳ hoạt động nào được thực hiện bởi hàm trên biến hoặc đối tượng sẽ được phản ánh trực tiếp bởi người gọi hàm. Chẳng hạn, hàm có thể thay đổi hoàn toàn nội dung của biến và trỏ nó vào một đối tượng hoàn toàn khác.  

 

Ngoài ra, hàm có thể gán lại nội dung của biến với tác dụng tương tự như bên dưới.  

 

Tóm lại, trong tham chiếu chuyển qua, hàm và người gọi sử dụng cùng một biến và đối tượng

Truyền theo giá trị trong Python là gì?

Theo cách tiếp cận này, chúng tôi chuyển một bản sao của các biến thực trong hàm dưới dạng tham số. Do đó, bất kỳ sửa đổi nào đối với các tham số bên trong hàm sẽ không phản ánh trong biến thực tế

 

Điều này cũng đúng với mọi thao tác được thực hiện bởi hàm trên biến hoặc đối tượng

 

Để tóm tắt các bản sao của các biến và các đối tượng trong ngữ cảnh của người gọi hàm là hoàn toàn bị cô lập

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. Trong Python, một biến hoặc tham chiếu khác không có kiểu nội tại.

Có phải tất cả Python đều vượt 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.

Chủ Đề