Python là các lớp được truyền theo tham chiếu

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?

Python là các lớp được truyền theo tham chiếu

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

Python là các lớp được truyền theo tham chiếu

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  140578841094144
2 đượ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  140578841094144
3 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  140578841094144
0

đầ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
1

Sự kết luận

Sau đây là những điểm chính rút ra từ bài viết này. -

  1. Nguyên tắc cơ bản của cuộc gọi theo giá trị
  2. Nguyên tắc cơ bản của cuộc gọi theo tham chiếu
  3. 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
  4. 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

Python là các lớp được truyền theo tham chiếu

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

Các lớp có được chuyển qua tham chiếu không?

Đạt một lớp theo tham chiếu . Ngoài việc chuyển lớp theo giá trị, bạn có thể chuyển lớp theo tham chiếu .

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

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ộ dữ liệu 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.

Mọi thứ trong Python có phải là tài liệu tham khảo không?

Mọi thứ được truyền theo giá trị nhưng giá trị đó là tham chiếu đến đối tượng ban đầu . Nếu bạn sửa đổi đối tượng, những thay đổi sẽ hiển thị cho người gọi, nhưng bạn không thể gán lại tên. Hơn nữa, nhiều đối tượng là bất biến (int, float, string, tuple).