Cách chuyển qua tham chiếu trong Python

Trong bài viết này, chúng ta đã khám phá cách truyền một biến bằng cách tham chiếu đến một hàm trong Python. Chúng tôi đã chứng minh ý tưởng bằng các đoạn mã Python

Có hai kiểu truyền tham số cho hàm trong Python

  1. Vượt qua giá trị
  2. Vượt qua tham chiếu

Vượt qua giá trị

Một bản sao của đối số được truyền cho hàm được tạo và khi bất kỳ thao tác nào được thực hiện trên bản sao, giá trị thực không thay đổi. Nó chỉ thay đổi giá trị của bản sao được tạo bên trong hàm

def fun[a]:
    a+=10
    print["Inside function call",a]
    
a=20
print["Before function call",a]
fun[a]
print["After function call",a]

đầu ra

Before function call 20                                                    
Inside function call 30                                                    
After function call 20

Giải trình

Tại đây, một bản sao của đối số được tạo và các thay đổi được thực hiện đối với bản sao đó để nó không ảnh hưởng đến giá trị ban đầu. Vì vậy, sau khi gọi hàm, nó sẽ in giá trị ban đầu

Vượt qua tham chiếu

Trong phần này, tham chiếu đến đối số gốc được truyền và khi bất kỳ thao tác nào được thực hiện trên đối số, giá trị thực cũng thay đổi. Nó thay đổi giá trị trong cả chức năng và trên toàn cầu

def fun[a]:
    a.append['i']
    print["Inside function call",a]
    
a=['H']
print["Before function call",a]
fun[a]
print["After function call",a]

đầu ra

Before function call ['H']                                                          
Inside function call ['H', 'i']                                                   
After function call ['H', 'i']

Giải trình
Ở đây, khi một danh sách được sử dụng, tham chiếu của nó được chuyển vào hàm khi có bất kỳ thay đổi nào được thực hiện đối với danh sách, hiệu ứng của nó được hiển thị ngay cả sau khi gọi hàm

Ví dụ dưới đây đưa ra lời giải thích chi tiết về cả hai

Python thực sự sử dụng Gọi theo tham chiếu đối tượng còn được gọi là Gọi theo chuyển nhượng, điều đó có nghĩa là nó phụ thuộc vào loại đối số được truyền

  1. Nếu các đối tượng bất biến được truyền thì nó sử dụng Gọi theo giá trị
  2. Nếu các đối tượng có thể thay đổi được truyền thì nó sử dụng Gọi theo tham chiếu

Đối tượng bất biến

Các đối tượng này không thể thay đổi trạng thái hoặc giá trị của chúng. Các loại đối tượng bất biến khác nhau là

  • Sợi dây
  • số nguyên
  • Tuple
def fun[s,num,d]:
    s="Hello"
    num=10
    d=[5,6,7]
    print["Inside function call",s,num,d]
s="Opengenus"
num=1
d=[1,2,3]
print["Before function call",s,num,d]
fun[s,num,d]
print["After function call",s,num,d]

đầu ra

Before function call Opengenus 1 [1, 2, 3]                                                                                    
Inside function call Hello 10 [5, 6, 7]                                                                                       
After function call Opengenus 1 [1, 2, 3]

Giải trình
Mặc dù các giá trị của s,num,d được thay đổi bên trong hàm nhưng giá trị ban đầu không bị thay đổi khi chúng được truyền theo giá trị. Do đó, nó in cùng một giá trị ngay cả sau khi gọi hàm

Đối tượng có thể thay đổi

Các đối tượng này có thể thay đổi trạng thái hoặc giá trị của chúng. Các loại đối tượng có thể thay đổi khác nhau là

  • Danh sách
  • Từ điển
  • Bộ
def fun[s,num,d]:
    s.append[5]
    num["name"]="harry"
    d|=set[{1,2}]
    print["Inside function call",s,num,d]
    
s=[1,2,4]
num={"name":"john"}
d={4,5,6}

print["Before function call",s,num,d]

fun[s,num,d]

print["After function call",s,num,d]

Giải trình
Ở đây, các đối tượng có thể thay đổi như từ điển, danh sách, tập hợp được truyền vào hàm và các giá trị của chúng được sửa đổi trong đó. Sau khi gọi hàm, giá trị ban đầu được cập nhật với giá trị mới

Truyền đối tượng bất biến theo tham chiếu

Như đã đề cập trước đó, bất cứ khi nào đối tượng bất biến được chuyển đến một hàm, nó sẽ được chuyển dưới dạng gọi theo giá trị. Nhưng hành vi này có thể được thay đổi bằng một số cách khác nhau như sau

Trả lại và chỉ định lại

Theo cách tiếp cận này, giá trị được thay đổi trong hàm được gọi và sau đó được trả về. Giá trị trả về này được gán cho biến ban đầu

def ref[s]:
    s+="Opengenus"
    return s
    
s="Hello "
print["Before passing to function -",s]
s=ref[s]
print["After passing to function -",s]

đầu ra
Trước khi chuyển sang chức năng - Xin chào
Sau khi chuyển sang chức năng - Xin chào Opengenus

Giải trình
Ở đây, chuỗi được sửa đổi trong hàm ref[] và được trả về. Giá trị trả về này được gán lại cho biến "s" để nó chứa giá trị đã sửa đổi

Sử dụng từ khóa Class và self

Theo cách này, từ khóa self được sử dụng để truy cập các biến thể hiện trong một lớp

________số 8_______

đầu ra
Trước khi gọi hàm 1
Sau khi gọi chức năng 2

Giải trình
Ở đây, biến thể hiện val được thay đổi bên trong hàm modify[]. Vì biến thể hiện được gán lại giá trị nên sau khi gọi hàm, giá trị ban đầu sẽ bị thay đổi

Truyền các đối tượng không thể thay đổi bên trong Từ điển hoặc Danh sách

Các đối tượng không thể thay đổi được truyền bên trong các đối tượng có thể thay đổi như từ điển hoặc danh sách hoặc đặt làm tham số cho hàm để chúng có thể được sửa đổi trong hàm

def change_dict[d]:
    d["hello"]="First Article"
    
def change_list[l]:
    l[0]=l[0]+5
    
    
d={"hello":"opengenus"}
l=[5]

print["Before passing to function values are "]
print["Dictionary - ",d]
print["List -",l]

change_dict[d]
change_list[l]

print["After passing to function values are "]
print["Dictionary - ",d]
print["List -",l]

đầu ra
Trước khi chuyển đến các giá trị hàm là
Từ điển - {'xin chào'. 'opengenus'}
Danh sách - [5]
Sau khi chuyển đến các giá trị hàm là
Từ điển - {'xin chào'. 'Bài viết đầu tiên'}
Danh sách - [10]

Hãy xem xét mã Python sau đây cho một câu hỏi thú vị

Before function call 20                                                    
Inside function call 30                                                    
After function call 20
0

Câu hỏi

Đầu ra của đoạn mã trên

Với đối số 10;

Với đối số 20;

Với đối số 12;

Không có điều nào ở trên

Ban đầu 10 được gửi làm đối số cho lớp và 10 được thêm vào và khi đối số không được gửi, 2 được khởi tạo và 10 được thêm lại

Bạn có thể chuyển qua tham chiếu bằng Python không?

Python truyền các đối số không phải theo tham chiếu hay theo giá trị mà theo phép gán .

Truyền giá trị qua tham chiếu trong Python là gì?

Chuyển theo tham chiếu so với giá trị trong Python . Mặt khác, khi bạn chuyển các đối số theo giá trị, các đối số sẽ trở thành bản sao độc lập của các giá trị ban đầu. When you give function parameters via reference, you're just passing references to values that already exist. When you pass arguments by value, on the other hand, the arguments become independent copies of the original values.

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

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.

Có phải Python luôn chuyển qua tham chiếu không?

Hai cách tiếp cận phổ biến và dễ hiểu nhất đối với việc truyền tham số giữa các ngôn ngữ lập trình là truyền theo tham chiếu và truyền theo giá trị. Thật không may, Python là "tham chiếu theo đối tượng", mà người ta thường nói. “Tham chiếu đối tượng được truyền theo giá trị. ”

Chủ Đề