Python có sao chép theo tham chiếu không?

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

Python có sao chép theo tham chiếu không?

 

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)

Python có sao chép theo tham chiếu khô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.  

Python có sao chép theo tham chiếu không?

 

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.  

Python có sao chép theo tham chiếu không?

 

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ế

Python có sao chép theo tham chiếu không?

 

Đ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

Python có sao chép theo tham chiếu khô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 value
9_______110_______
['Nothing, 'how', 'are', 'you', 'doing']
1
['Nothing, 'how', 'are', 'you', 'doing']
2_______11_______5
['Nothing, 'how', 'are', 'you', 'doing']
4
Inside Function: new value
Outside Function: old value
5
['Nothing, 'how', 'are', 'you', 'doing']
6
Inside Function: new value
Outside Function: old value
5
['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_______0
110001234557894
110001234557894
True
8# Python code to demonstrate4

đầu ra
 

Inside Function [10, 20, 30, 40, 50]
Outside Function: [10, 20, 30, 40, 50]

 

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
 

110001234557894
110001234557894
True

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']
2
Inside Function: new value
Outside Function: old value
5
['Nothing, 'how', 'are', 'you', 'doing']
4
Inside Function: new value
Outside Function: old value
5
['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']
2
Inside Function: new value
Outside Function: old value
5
['Nothing, 'how', 'are', 'you', 'doing']
4
Inside Function: new value
Outside Function: old value
5
['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
 

541190289536222
541190288737777
False

Đầ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]
3
Inside 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]
3
Inside 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]
3
Inside Function [10, 20, 30, 40, 50]
Outside Function: [10, 20, 30, 40, 50]
9
110001234557894
110001234557894
True
0
110001234557894
110001234557894
True
1
Inside 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
True
4

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_______0
110001234557894
110001234557894
True
8
110001234557894
110001234557894
True
2

đầu ra
 

Inside Function: new value
Outside Function: old value

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]
3
Inside Function [10, 20, 30, 40, 50]
Outside Function: [10, 20, 30, 40, 50]
57
Inside 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']
1
Inside Function [10, 20, 30, 40, 50]
Outside Function: [10, 20, 30, 40, 50]
67
Inside Function: new value
Outside Function: old value
5
Inside Function [10, 20, 30, 40, 50]
Outside Function: [10, 20, 30, 40, 50]
69
Inside Function: new value
Outside Function: old value
5
Inside Function [10, 20, 30, 40, 50]
Outside Function: [10, 20, 30, 40, 50]
71
Inside Function: new value
Outside Function: old value
5
Inside Function [10, 20, 30, 40, 50]
Outside Function: [10, 20, 30, 40, 50]
73
Inside Function: new value
Outside Function: old value
5
Inside Function [10, 20, 30, 40, 50]
Outside Function: [10, 20, 30, 40, 50]
75
['Nothing, 'how', 'are', 'you', 'doing']
9

Là Python bằng cách tham khảo hoặc sao chép?

Python sử dụng một hệ thống, được gọi là “ Gọi theo tham chiếu đối tượng ” hoặc “Gọi theo chỉ định”. Trong trường hợp bạn truyền các đối số như số nguyên, chuỗi hoặc bộ cho một hàm, thì việc truyền giống như gọi theo giá trị vì bạn không thể thay đổi giá trị của các đối tượng bất biến được truyền cho hàm.

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

Các đối số được truyền bằng phép gán trong Python. Bài tập chỉ tạo 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 đối số được gọi là 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à Gọi theo Tham chiếu .

Python có vượt qua bản sao không?

Đây không phải là những gì Python làm, Python không sử dụng mô hình truyền theo giá trị. Đây có vẻ giống như mô hình chuyển theo giá trị vì chúng tôi đã cho điểm này là 3, đổi thành 4 và thay đổi không được phản ánh ra bên ngoài ( a vẫn là 3). Nhưng trên thực tế, Python không sao chép dữ liệu vào hàm .

Các chuỗi có được sao chép bằng Python tham chiếu không?

Cách Pythonic giải quyết vấn đề này là giữ các chuỗi trong một danh sách và nối chúng lại với nhau sau khi bạn có tất cả các phần. Python không bao giờ chuyển qua tham chiếu .