Chuyển qua tham chiếu so với giá trị trong Python

Pass Reference Vs



Sau khi biết Python, bạn có thể tìm thấy các trường hợp mà các hàm không thay đổi các đối số tại một vị trí như bạn mong đợi, đặc biệt nếu bạn đã quen với nhiều ngôn ngữ máy tính khác. Nhiều ngôn ngữ sử dụng các đối số của phương thức làm tham chiếu, được định nghĩa là truyền bằng Tham chiếu đến các biến hiện tại. Nếu bạn là một nhà phát triển Python nâng cao muốn nắm bắt cách xử lý các đối số phương pháp cụ thể của Python, thì hướng dẫn này thực sự dành cho bạn.

Python hỗ trợ chuyển qua tham chiếu đối tượng

Không thể phủ nhận việc truyền tham chiếu và chuyển theo giá trị là hai cách được công nhận và dễ hiểu nhất để truyền tham số giữa các ngôn ngữ lập trình. Đáng buồn thay, Python là ‘pass-by-object-reference’, không phải Pass by Value hay Pass by Reference, thường được gọi là Tham chiếu theo Đối tượng cũng như Gọi theo Chia sẻ. Sẽ rất hữu ích nếu bạn xem xét kỹ hơn về bản thân khái niệm bằng cách chia nó thành các phân đoạn trong khi bạn đi sâu vào các chi tiết kỹ thuật cụ thể khi lướt qua Tham chiếu:







Đi qua: điều này có nghĩa là cung cấp một phương thức với một đối số.



Bằng cách tham khảo: điều này có nghĩa là đối số bạn chuyển sang phương thức đề cập đến một biến hiện đang nằm trong bộ nhớ thay vì một bản sao khác của biến đó.



Khi bạn gán phương thức một tham chiếu cho một biến đã xác định, biến mà nó tương ứng sẽ bị ảnh hưởng rõ ràng bởi tất cả các thao tác trên Tham chiếu này. Bây giờ chúng ta hãy xem xét một ví dụ về cách, trong thực tế, điều này hoạt động. Trong ví dụ này, chúng tôi đã xác định một biến ‘ tức giận' có giá trị 4 . Trong toàn bộ kịch bản này, biến ‘ tức giận' đã không được sửa đổi ở vị trí của nó. Python dường như xử lý đối số được cung cấp của bạn thay vì tham chiếu đến biến hiện tại dưới dạng giá trị tự chứa.





Điều này có nghĩa là thay vì bằng Tham chiếu, Python di chuyển các đối số theo giá trị? Python di chuyển các đối số thông qua phép gán, vì vậy không phải bằng Tham chiếu hoặc bằng giá trị. Logic cho điều này là hai phần:



Hiện tại, tham số truyền vào là một con trỏ đến một đối tượng. Một số loại dữ liệu có thể thay đổi và một số không thể thay đổi.

Nếu chúng ta di chuyển một đối tượng có thể thay đổi vào một hàm, thì hàm sẽ nhận được một tham chiếu đến cùng một đối tượng để bạn có thể biến đổi tất cả theo sự hài lòng của tâm hồn mình; tuy nhiên, phạm vi bên ngoài sẽ không biết gì trước khi bạn tham gia lại Tham chiếu trong hàm. Sau khi bạn hoàn thành, Tham chiếu bên ngoài sẽ chỉ nhắm vào đối tượng thực tế. Nếu bạn di chuyển một đối tượng không thể thay đổi vào một hàm, Tham chiếu bên ngoài luôn có thể không được liên kết lại và bạn không thể chỉ thay đổi đối tượng. Để làm cho mọi thứ trở nên đơn giản hơn nhiều, chúng ta hãy hiểu từng thứ một.

Chuyển qua tài liệu tham khảo

Trước hết, bạn phải hiểu rằng bản thân biến 'mylist' không phải là một danh sách mà là một danh sách có các giá trị. Bạn có thể gọi biến ‘mylist’ là một vùng chứa có các giá trị bên trong nó. Các giá trị danh sách là các đối tượng. Biến ‘mylist’ đã được chuyển thẳng vào hàm với nội dung của nó.

Cả danh sách và danh sách của tôi dường như là cùng một biến lưu trữ trong ví dụ mã bên dưới và do đó áp dụng cho cùng một đối tượng lưu trữ. Đó là lý do tại sao trên đầu ra, nó in 'Saeed.'

Bất kỳ hành động nào được thực hiện trên biến hoặc thực thể sẽ được sao chép ngay lập tức sang phương thức người gọi. Phương thức này hoàn toàn có thể sửa đổi giá trị của biến và hướng nó vào một đối tượng hoàn toàn khác biệt. Như bạn có thể thấy trong hàm ‘set_list’, chúng tôi đã thay đổi nội dung danh sách và in một danh sách hoàn toàn mới có phần tử ‘Aqsa.’ Điều này là do chúng tôi đã trả lại danh sách đã sửa đổi và in nó ở cùng dòng với trình gọi.

Phương thức này cũng có thể phân bổ lại các phần tử của biến để có kết quả tương tự như bên dưới. Bạn có thể thấy chúng tôi đã thêm một giá trị mới vào danh sách và thay đổi đã được phản ánh. Chúng tôi đã thêm một chuỗi duy nhất vào danh sách và trả lại cho người gọi. Để kết luận, phương thức và trình gọi đã sử dụng cùng một biến và đối tượng trong suốt quan hệ chuyển qua.

Vượt qua giá trị

Thông qua việc chuyển theo giá trị, phương thức được cung cấp một bản sao của đối tượng đối số mà người gọi gán cho nó. Điều này đảm bảo rằng mục gốc vẫn không thay đổi và tất cả các sửa đổi được thực hiện được lưu giữ tại các vị trí bộ nhớ riêng biệt trong một bản sao của cùng một đối tượng.

Nó có giá trị như nhau với bất kỳ hoạt động nào được thực thi trên một biến hoặc thực thể theo phương thức. Các bản sao của các biến & đối tượng trong phạm vi của phương thức trình gọi được tách biệt hoàn toàn để tóm tắt chúng.

Chuyển đối tượng theo tham chiếu

Trong tình huống này, vì Python là khác biệt, các phương thức của Python nhận được tham chiếu đối tượng rất giống nhau trong bộ lưu trữ khi người gọi đề cập đến. Ngược lại, kỹ thuật này không lấy được biến ‘mylist’ (vùng chứa). Phương thức người gọi lưu trữ cùng một đối tượng; phương pháp này tạo vùng chứa của một người và tạo ra một chỉ mục hoàn toàn mới cho chính nó, giống như trong giá trị chuyển.

Người gọi và phương thức nói về cùng một đối tượng trong bộ nhớ, nhưng khi phương thức nối thêm áp dụng một mục bên ngoài vào danh sách, thì thực thể người gọi sẽ bị sửa đổi. Chúng có nhiều nhãn, nhưng chúng giống nhau. Cả hai biến đều chứa một đối tượng rất giống nhau. Đó là ý nghĩa liên quan đến chuyển động của đối tượng. Trong bộ nhớ, phương thức và trình gọi sử dụng một đối tượng tương tự nhưng bắt chúng thông qua nhiều biến. Biến người gọi (vùng chứa) sẽ không bị thay đổi bởi bất kỳ sửa đổi nào được thực hiện đối với biến phương thức (vùng chứa); chỉ dữ liệu hoặc nội dung được sửa đổi.

Phần kết luận

Python hoạt động độc lập với các ngôn ngữ chấp nhận việc di chuyển theo Tham chiếu hoặc giá trị của các đối số. Các đối số của phương thức là các biến cục bộ đã được cấp phát cho mỗi giá trị được chuyển đến phương thức. Nhưng điều đó vẫn không ngăn cản bạn đạt được kết quả tương tự như bạn sẽ tìm thấy ở các ngôn ngữ khác khi di chuyển các đối số bằng proxy.