Không thể phủ nhận pass-by-reference và pass-by-value 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à 'tham chiếu theo đối tượng', không phải là "Truyền theo giá trị" hay "Truyền theo tham chiếu", thường được gọi là "Gọi theo tham chiếu đố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 bản thân khái niệm này bằng cách chia nhỏ 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 chuyển qua Tham khảo
Đ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ố
theo 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 nằm trong bộ lưu trữ thay vì một bản sao khác của biến đó
Khi bạn gán cho phương thức một tham chiếu đến 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 thức hoạt động của điều này trong thực tế. Trong ví dụ này, chúng tôi đã xác định một biến 'arg' có giá trị là 4. Trong suốt tình huống này, biến 'arg' 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ị độc lập
Điều này có nghĩa là thay vì theo Tham chiếu, Python di chuyển các đối số theo giá trị? . Logic cho điều này là gấp đôi
Hiện tại, tham số truyền vào là một con trỏ tới 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 thành một hàm, thì hàm đó sẽ có được một tham chiếu đến chính đối tượng đó để bạn có thể thay đổi tất cả đối tượng đó theo ý muốn của mình; . 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 bất biến sang 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ể thay đổi đối tượng. Để làm cho mọi thứ đơn giản hơn nhiều, hãy hiểu từng cái một
Vượt qua tham chiếu
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à dùng để chỉ 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 đưa thẳng vào hàm với nội dung của nó
Cả “danh sách” & “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 phản ánh ngay lập tức sang phương thức gọi. Phương thức có thể sửa đổi hoàn toàn giá trị của biến và nhắm 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 người 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à người gọi đã sử dụng cùng một biến và đối tượng trong suốt mối quan hệ truyền qua
Vượt qua giá trị
Thông qua truyền 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 không thay đổi và tất cả các sửa đổi đã thực hiện được giữ lạ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ỳ thao tác nào được thực hiện trên một biến hoặc thực thể theo phương thức. Các bản sao của biến & đối tượng trong phạm vi của phương thức gọi được tách biệt hoàn toàn để tóm tắt chúng
Truyền đối tượng theo tham chiếu
Trong trường hợp này, vì Python là khác biệt, nên các phương thức của Python có đượ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;
Người gọi và phương thức nói về cùng một đối tượng trong bộ lưu trữ, nhưng khi phương thức được nối thêm áp dụng một mục bên ngoài vào danh sách, thực thể người gọi sẽ được sửa đổi. Chúng có nhiều nhãn, nhưng chúng giống nhau. Cả hai biến giữ một đối tượng rất giống nhau. Đó là ý nghĩa đằng sau mối liên hệ của nó với chuyển động của vật thể. Trong bộ lưu trữ, phương thức và người 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 [bộ 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 [bộ chứa];
Phần kết luận
Python hoạt động độc lập với các ngôn ngữ chấp nhận di chuyển theo Tham chiếu hoặc giá trị của đối số. Đố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 truyền cho 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ự mà bạn sẽ tìm thấy ở các ngôn ngữ khác trong khi di chuyển các đối số bằng proxy