Python sử dụng một cơ chế, được gọi là "Gọi theo đối tượng", đôi khi còn được gọi là "Gọi theo tham chiếu đối tượng" hoặc "Gọi theo chia sẻ"
Nếu bạn truyền các đối số không thay đổi như số nguyên, chuỗi hoặc bộ dữ liệu cho một hàm, thì việc truyền đó hoạt động như Gọi theo giá trị. Nó khác, nếu chúng ta truyền các đối số có thể thay đổi
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
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
def set_list(list):
list = [ a = ["X", "Y"]0_______0_______1 a = ["X", "Y"]2 a = ["X", "Y"]1 a = ["X", "Y"]4 a = ["X", "Y"]5
a = ["X", "Y"]7 list
def def0list):
listdef5def6def7
a = ["X", "Y"]7 list
set_list(1= [set_list(4 a = ["X", "Y"]5
set_list(6set_list(7
set_list(6set_list(9
đầ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
Inside Function: new value Outside Function: old value9_______110_______ ['Nothing, 'how', 'are', 'you', 'doing']1['Nothing, 'how', 'are', 'you', 'doing']2_______11_______5['Nothing, 'how', 'are', 'you', 'doing']4Inside Function: new value Outside Function: old value5['Nothing, 'how', 'are', 'you', 'doing']6Inside Function: new value Outside Function: old value5['Nothing, 'how', 'are', 'you', 'doing']8['Nothing, 'how', 'are', 'you', 'doing']9
# Python code to demonstrate0
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]9_______22_______0110001234557894 110001234557894 True8# Python code to demonstrate4
đầu ra
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
# Python code to demonstrate5_______110_______ # Python code to demonstrate7
# Python code to demonstrate8_______110_______ # Python code to demonstrate7
# call by value1
# call by value2
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]9_______22_______0# call by value5# call by value6
# call by value1
# call by value2
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]9_______22_______0# call by value5string2
string3
string4
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]9_______149_______6string7 string8
đầu ra
Bây giờ, hãy thử và hiểu điều này tốt hơn với một ví dụ khác
ví dụ 2
Python3
# Python code to demonstrate5_______110_______ ['Nothing, 'how', 'are', 'you', 'doing']1['Nothing, 'how', 'are', 'you', 'doing']2Inside Function: new value Outside Function: old value5['Nothing, 'how', 'are', 'you', 'doing']4Inside Function: new value Outside Function: old value5['Nothing, 'how', 'are', 'you', 'doing']6['Nothing, 'how', 'are', 'you', 'doing']9
# Python code to demonstrate8_______110_______ ['Nothing, 'how', 'are', 'you', 'doing']1['Nothing, 'how', 'are', 'you', 'doing']2Inside Function: new value Outside Function: old value5['Nothing, 'how', 'are', 'you', 'doing']4Inside Function: new value Outside Function: old value5['Nothing, 'how', 'are', 'you', 'doing']6['Nothing, 'how', 'are', 'you', 'doing']9
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]07
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]08
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]09
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]9_______22_______0# call by value5# call by value6
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]07
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]08
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]09
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]9_______22_______0# call by value5string2
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]21
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]22
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]9_______149_______6string7 string8
đầu ra
Đầu ra của hai ví dụ trên là 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
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]1 Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]28
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]3
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]3Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]31
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]3Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]33
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]3# Python code to demonstrate5= Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]37
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]3Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]9110001234557894 110001234557894 True0110001234557894 110001234557894 True1Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]42
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]3
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]3
110001234557894 110001234557894 True4
string= Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]48
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]49
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]9_______22_______0110001234557894 110001234557894 True8110001234557894 110001234557894 True2
đầu ra
Trong ví dụ trên, một chuỗi là một loại đối tượng không thay đổi được truyền dưới dạng đố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
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]1 Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]28
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]3Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]57Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]58['Nothing, 'how', 'are', 'you', 'doing']9= Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]61
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]3
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]63
Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]64= ['Nothing, 'how', 'are', 'you', 'doing']1Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]67Inside Function: new value Outside Function: old value5Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]69Inside Function: new value Outside Function: old value5Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]71Inside Function: new value Outside Function: old value5Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]73Inside Function: new value Outside Function: old value5Inside Function [10, 20, 30, 40, 50] Outside Function: [10, 20, 30, 40, 50]75['Nothing, 'how', 'are', 'you', 'doing']9