Bản tóm tắt. Các biến được truyền theo tham chiếu đối tượng trong Python. Do đó, các đối tượng có thể thay đổi được truyền theo tham chiếu trong khi các đối tượng không thay đổi được truyền theo giá trị trong Python. Để chuyển các đối tượng bất biến bằng tham chiếu, bạn có thể trả về và gán lại giá trị cho biến hoặc chuyển nó vào trong từ điển/danh sách hoặc tạo một lớp và sử dụng biến self để tham khảo
Làm cách nào để chuyển một biến theo tham chiếu trong Python?
Xem video này trên YouTube
Vấn đề. Làm cách nào để chuyển một biến theo tham chiếu trong Python?
Để sử dụng các hàm và lớp trong Python hoặc bất kỳ ngôn ngữ lập trình nào khác, điều cực kỳ quan trọng là chúng ta phải hiểu cách gọi hàm hoạt động dựa trên Gọi theo tham chiếu hoặc Gọi theo giá trị hoặc Gọi theo tham chiếu đối tượng. Hãy để chúng tôi thảo luận từng khái niệm này trước khi chúng tôi đi đến giải pháp cuối cùng
Nguyên tắc cơ bản của cuộc gọi theo giá trị
Trong phương thức gọi theo giá trị, giá trị của một đối số được sao chép vào tham số của hàm. Do đó, bất kỳ thay đổi nào được thực hiện đối với tham số bên trong hàm được gọi không được phản ánh trong các tham số thực tế của hàm gọi vì biến bên trong hàm được gọi và hàm gọi đề cập đến hai vị trí khác nhau trong bộ nhớ
Thí dụ
def func[]: a = 10 print["Before Function call value of a = ",a] increment[a] print["After Function call is over value of a = ",a] print["Identity of a in func[] is ",id[a]] def increment[k]: a = k+10 print["Inside function call Value of a = ",a] print["Identity of a in increment[] is ",id[a]] return a func[]
đầu ra
Before Function call value of a = 10 Inside function call Value of a = 20 Identity of a in increment[] is 140578841094464 After Function call is over value of a = 10 Identity of a in func[] is 140578841094144
Nguyên tắc cơ bản của cuộc gọi theo tham chiếu
Trong phương thức Gọi theo tham chiếu, địa chỉ của đối số được truyền cho hàm được gọi. Do đó, chúng tôi đang tham chiếu đến địa chỉ của biến trong trường hợp này và mọi thay đổi được thực hiện trong tham số bên trong hàm cũng được phản ánh bên ngoài hàm
Gọi theo tham chiếu được hỗ trợ bởi các ngôn ngữ như Java. Chúng ta hãy xem một chương trình java nhỏ để hình dung định lý làm việc của lời gọi bằng phương thức tham chiếu. [ Tôi chủ ý sử dụng Java ở đây để chúng ta có thể so sánh và đối chiếu sự khác biệt khi thảo luận về Gọi theo phương thức tham chiếu đối tượng using Python in a while.]
public class Reference{ int data=10; public static void main[String args[]]{ Reference obj=new Reference[]; System.out.println["before change "+obj.data]; obj.change[obj];//passing object System.out.println["after change "+obj.data]; } void change[Reference obj]{ obj.data=obj.data+100;//changes will be in the instance variable } }
đầu ra
before change 10 after change 110
Để hiểu sự khác biệt với Phương thức gọi theo tham chiếu và Gọi theo giá trị, vui lòng xem hình ảnh động được cung cấp bên dưới
Nguyên tắc cơ bản của cuộc gọi theo tham chiếu đối tượng
Nhiều người trong số các bạn có thể đã bắt gặp cách gọi theo tham chiếu và gọi theo giá trị của các phương thức gọi hàm nhưng nếu bạn là người mới trong thế giới Python, thì có lẽ thuật ngữ Gọi theo tham chiếu đối tượng còn mới đối với bạn. Đây là lời nhắc dành cho bạn trước khi chúng ta thảo luận về cách hoạt động của lệnh gọi hàm trong Python – Mọi thứ đều là đối tượng trong Python.
Python không sử dụng cuộc gọi theo giá trị cũng như cuộc gọi theo tham chiếu. Nó sử dụng tham chiếu theo đối tượng/gọi theo chỉ định có nghĩa là. -
- Khi một đối tượng có thể thay đổi như danh sách được chuyển đến một hàm, nó sẽ thực hiện gọi theo tham chiếu
- Khi một đối tượng bất biến như một số, chuỗi hoặc bộ dữ liệu được truyền cho một hàm, nó sẽ thực hiện lệnh gọi theo giá trị
Thí dụ. Chương trình sau minh họa khái niệm trên trong đó Python thực hiện gọi theo tham chiếu trong trường hợp đối tượng có thể thay đổi như danh sách trong khi gọi theo giá trị trong trường hợp đối tượng không thay đổi như chuỗi. -
def refer[l]: l.append[5] print["list inside function : ",l] return l def value[n]: name = "Python" print["Name within function : ",name] return name li = [1,2,3,4] print["list before function return : ",li] refer[li] print["list after function return : ",li] name = "Finxter" print["Name before function return : ",name] value[name] print["Name after function return : ",name]
đầu ra
list before function return : [1, 2, 3, 4] list inside function : [1, 2, 3, 4, 5] list after function return : [1, 2, 3, 4, 5] Name before function return : Finxter Name within function : Python Name after function return : Finxter
Bây giờ điều đó đưa chúng ta đến câu hỏi quan trọng về nhiệm vụ
Làm cách nào để chuyển một biến bất biến theo tham chiếu trong Python?
Đây sẽ không phải là vấn đề trong trường hợp các đối tượng có thể thay đổi nhưng trong trường hợp đối tượng không thể thay đổi, chúng ta phải rút ra một vài thủ thuật từ túi của mình để thay đổi chúng. Chúng ta hãy xem xét một số trong số đó trong giai đoạn tiếp theo của bài viết của chúng tôi
Phương pháp 1. Trả lại giá trị mới và gán lại
Một cách giải quyết đơn giản để chuyển một biến bất biến như chuỗi theo tham chiếu là chấp nhận biến đó, thực hiện các sửa đổi trên biến đó và trả về giá trị. Sau khi trả về biến, hãy gán lại giá trị được trả về từ hàm cho biến vì nó nằm ngoài phạm vi cục bộ của hàm
Điều này có thể hơi khó hiểu nhưng đoạn mã sau đây sẽ giúp bạn hiểu rõ mọi thứ
def change[n]: n = "Sayon" return n name = "Shubham" print["Name before function call is ", name] name = change[name] print["Name after function call is ", name]
đầu ra
Name before function call is Shubham Name after function call is Sayon
Phương pháp 2. Truyền giá trị bất biến bằng từ điển hoặc danh sách
Bây giờ, phương pháp này là một mẹo nhỏ để xử lý việc vượt qua tham chiếu của các đối tượng không thay đổi. Vì Từ điển Python là các đối tượng kiểu ánh xạ và có thể thay đổi nên bạn có thể xác định các biến bất biến của mình bên trong từ điển rồi chuyển chúng vào hàm. Tuy nhiên, mặc dù danh sách không được sử dụng để ánh xạ đối tượng, bạn vẫn có thể sử dụng chúng như từ điển vì có thể truy cập các mục của danh sách bằng cách sử dụng chỉ mục của chúng và danh sách có thể thay đổi
Chúng ta hãy xem cách chúng ta xác định một chuỗi và một số và chuyển chúng dưới dạng tham chiếu bằng cách sử dụng danh sách và từ điển
________số 8đầu ra
***Values Before Function Call*** Name: Christian Number: 4 ***Values After Function Call*** Name: Mayer Number: 5
Phương pháp 3. Sử dụng Lớp và bản thân Từ khóa
Từ khóa
Before Function call value of a = 10 Inside function call Value of a = 20 Identity of a in increment[] is 140578841094464 After Function call is over value of a = 10 Identity of a in func[] is 1405788410941442 được sử dụng để truy cập các thuộc tính của phiên bản. Chúng ta có thể đặt các thuộc tính bên trong
Before Function call value of a = 10 Inside function call Value of a = 20 Identity of a in increment[] is 140578841094464 After Function call is over value of a = 10 Identity of a in func[] is 1405788410941443 và sau đó thay đổi giá trị của chúng trong các phương thức mẫu
Chúng ta hãy xem chương trình sau đây để hiểu cách thức hoạt động của chương trình này đối với chúng tôi
Before Function call value of a = 10 Inside function call Value of a = 20 Identity of a in increment[] is 140578841094464 After Function call is over value of a = 10 Identity of a in func[] is 1405788410941440
đầu ra
Before Function call value of a = 10 Inside function call Value of a = 20 Identity of a in increment[] is 140578841094464 After Function call is over value of a = 10 Identity of a in func[] is 1405788410941441
Sự kết luận
Sau đây là những điểm chính rút ra từ bài viết này. -
- Nguyên tắc cơ bản của cuộc gọi theo giá trị
- Nguyên tắc cơ bản của cuộc gọi theo tham chiếu
- Nguyên tắc cơ bản của cuộc gọi theo tham chiếu đối tượng trong Python cho các đối tượng có thể thay đổi và không thể thay đổi
- Các phương thức truyền đối tượng bất biến bằng tham chiếu trong Python
Tôi hy vọng bạn tìm thấy bài viết này hữu ích. Hãy đăng ký và theo dõi các bài viết thú vị hơn trong tương lai
Shubham Sayon
Tôi là một người tạo nội dung và Blogger Python chuyên nghiệp. Tôi đã xuất bản nhiều bài báo và tạo các khóa học trong một khoảng thời gian. Hiện tại tôi đang làm việc với tư cách là một freelancer toàn thời gian và tôi có kinh nghiệm trong các lĩnh vực như Python, AWS, DevOps và Networking