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
a = ["X", "Y"]04
a = ["X", "Y"]05
a = ["X", "Y"]06
a = ["X", "Y"]07
a = ["X", "Y"]08
a = ["X", "Y"]06
a = ["X", "Y"]10
a = ["X", "Y"]11
a = ["X", "Y"]0
a = ["X", "Y"]1
a = ["X", "Y"]2
a = ["X", "Y"]1
a = ["X", "Y"]4
a = ["X", "Y"]5
________ 108 ________ 07 ________ 106
a = ["X", "Y"]04
a = ["X", "Y"]040
a = ["X", "Y"]06
a = ["X", "Y"]07
a = ["X", "Y"]08
a = ["X", "Y"]06____1045
a = ["X", "Y"]046
a = ["X", "Y"]047
________ 108 ________ 07 ________ 106
a = ["X", "Y"]051
a = ["X", "Y"]10
a = ["X", "Y"]11
a = ["X", "Y"]054
a = ["X", "Y"]5
a = ["X", "Y"]056
a = ["X", "Y"]057
a = ["X", "Y"]056
a = ["X", "Y"]059
đầu ra
['A', 'B', 'C'] ['E', 'D']
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 chính xác cùng một đối tượng 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
a = ["X", "Y"]19
a = ["X", "Y"]10
a = ["X", "Y"]21_______122
a = ["X", "Y"]15
a = ["X", "Y"]24
a = ["X", "Y"]15
a = ["X", "Y"]26
a = ["X", "Y"]15
a = ["X", "Y"]28
a = ["X", "Y"]29
a = ["X", "Y"]340
a = ["X", "Y"]19
a = ["X", "Y"]20____228
a = ["X", "Y"]344
Đầu ra
a = ["X", "Y"]1
Ràng buộc tên đối tượng
Trong python, mỗi biến mà chúng ta gán giá trị/vùng chứa được coi là một đối tượng. Khi chúng ta gán một giá trị cho một biến, chúng ta thực sự đang gắn tên cho một đối tượng.
Python3
a = ["X", "Y"]345
a = ["X", "Y"]10
a = ["X", "Y"]347
a = ["X", "Y"]348
a = ["X", "Y"]10
a = ["X", "Y"]347
a = ["X", "Y"]421
a = ["X", "Y"]422
a = ["X", "Y"]19
a = ["X", "Y"]20____1425
a = ["X", "Y"]426
a = ["X", "Y"]421
a = ["X", "Y"]422
a = ["X", "Y"]19
a = ["X", "Y"]20____1425
a = ["X", "Y"]492
a = ["X", "Y"]493
a = ["X", "Y"]494
a = ["X", "Y"]19
a = ["X", "Y"]496
a = ["X", "Y"]497
a = ["X", "Y"]498
Đầu ra
a = ["X", "Y"]2
Bây giờ, hãy thử và hiểu điều này tốt hơn bằng một ví dụ khác.
Ví dụ 2.
Python3
a = ["X", "Y"]345
a = ["X", "Y"]10
a = ["X", "Y"]21
a = ["X", "Y"]22
a = ["X", "Y"]15
a = ["X", "Y"]24
a = ["X", "Y"]15
a = ["X", "Y"]26
a = ["X", "Y"]29
a = ["X", "Y"]348
a = ["X", "Y"]10
a = ["X", "Y"]21
a = ["X", "Y"]22
a = ["X", "Y"]15
a = ["X", "Y"]24
a = ["X", "Y"]15
a = ["X", "Y"]26
a = ["X", "Y"]29
a = ["X", "Y"]107
a = ["X", "Y"]108
a = ["X", "Y"]109
a = ["X", "Y"]19
a = ["X", "Y"]20____1425
a = ["X", "Y"]426
a = ["X", "Y"]107
a = ["X", "Y"]108
a = ["X", "Y"]109
a = ["X", "Y"]19
a = ["X", "Y"]20____1425
a = ["X", "Y"]492
a = ["X", "Y"]121
a = ["X", "Y"]122
a = ["X", "Y"]19
a = ["X", "Y"]496
a = ["X", "Y"]497
a = ["X", "Y"]498
Đầu ra
a = ["X", "Y"]8
Đầu ra của hai ví dụ trên khác nhau vì danh sách có thể thay đổi và chuỗi không thay đổi. Một biến bất biến không thể thay đổi sau khi được tạo. Nếu chúng ta muốn thay đổi một biến bất biến, chẳng hạn như một chuỗi, chúng ta phải tạo một thể hiện mới và liên kết biến với thể hiện mới. Trong khi đó, biến có thể thay đổi có thể được thay đổi tại chỗ.
Ví dụ 3.
Python3
a = ["X", "Y"]11
a = ["X", "Y"]128
a = ["X", "Y"]13
a = ["X", "Y"]13
a = ["X", "Y"]131
a = ["X", "Y"]13____2133
a = ["X", "Y"]13
a = ["X", "Y"]345
a = ["X", "Y"]10
a = ["X", "Y"]137
a = ["X", "Y"]13
a = ["X", "Y"]19
a = ["X", "Y"]20
a = ["X", "Y"]21
a = ["X", "Y"]142
a = ["X", "Y"]13
a = ["X", "Y"]13
a = ["X", "Y"]24
a = ["X", "Y"]49
a = ["X", "Y"]10
a = ["X", "Y"]148
a = ["X", "Y"]149
a = ["X", "Y"]19
a = ["X", "Y"]20____228
a = ["X", "Y"]22
Đầu ra.
a = ["X", "Y"]1
Trong ví dụ trên, một chuỗi là một loại đối tượng không thay đổi được truyền làm đối số cho hàm foo. Trong phạm vi của hàm đã cho foo, a= “giá trị mới” đã được liên kết với cùng một đối tượng mà chuỗi đã được liên kết bên ngoài. Trong phạm vi của hàm foo, chúng tôi sửa đổi “giá trị cũ”` thành “giá trị mới”. Khi chúng tôi rời khỏi phạm vi của chức năng foo , a=”new value” không còn trong không gian tên và giá trị mà chuỗi đề cập đến không bao giờ thay đổi.
Ví dụ 4. Bây giờ, chúng ta hãy xem biến có thể thay đổi được truyền vào hàm như thế nào.
Python3
a = ["X", "Y"]11
a = ["X", "Y"]128
a = ["X", "Y"]13
a = ["X", "Y"]157____2158
a = ["X", "Y"]29
a = ["X", "Y"]10
a = ["X", "Y"]161
a = ["X", "Y"]13
a = ["X", "Y"]163
a = ["X", "Y"]164
a = ["X", "Y"]10
a = ["X", "Y"]21
a = ["X", "Y"]167
a = ["X", "Y"]15
a = ["X", "Y"]169
a = ["X", "Y"]15
a = ["X", "Y"]171
a = ["X", "Y"]15
a = ["X", "Y"]173
a = ["X", "Y"]15
a = ["X", "Y"]175
a = ["X", "Y"]29