Danh sách python có được chuyển theo giá trị hoặc tham chiếu không?

Tất cả các tham số [đối số] trong ngôn ngữ Python đều được truyền theo tham chiếu. Điều đó có nghĩa là nếu bạn thay đổi tham số đề cập đến trong một hàm, thì thay đổi đó cũng phản ánh lại trong hàm gọi

Thí dụ

Bản thử trực tiếp

#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist.append[[1,2,3,4]];
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist

đầu ra

Ở đây, chúng tôi đang duy trì tham chiếu của đối tượng đã truyền và các giá trị nối thêm trong cùng một đối tượng. Vì vậy, điều này sẽ tạo ra kết quả sau -

Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]

Có một ví dụ nữa trong đó đối số được truyền theo tham chiếu và tham chiếu đang bị ghi đè bên trong hàm được gọi

Thí dụ

Bản thử trực tiếp

#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist

đầu ra

Tham số mylist là cục bộ của hàm changeme. Thay đổi danh sách của tôi trong chức năng không ảnh hưởng đến danh sách của tôi. Hàm này không hoàn thành gì và cuối cùng, điều này sẽ tạo ra kết quả sau -

Nếu chúng ta chuyển danh sách dưới dạng tham số cho một hàm và thay đổi tham số, thì danh sách ban đầu cũng bị thay đổi. Điều này là do danh sách là một loại có thể thay đổi, khi chúng ta chuyển danh sách cho một hàm, chúng ta sẽ chuyển cùng một danh sách

def my_fun[my_list]:
    my_list.append[1]

    return my_list


x = [1, 2, 3]
y = my_fun[x]

print[f"x: {x}, y: {y}"]
# x, y are both [1, 2, 3, 1]

Làm cách nào chúng tôi có thể chuyển "giá trị" của danh sách này thay vì "tham chiếu" của nó?

  • cắt lát.
    Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
    Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
    5
  • danh sách[].
    Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
    Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
    6
  • Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
    Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
    7.
    Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
    Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
    8
  • Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
    Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
    9.
    #!/usr/bin/python
    # Function definition is here
    def changeme[ mylist ]:
    "This changes a passed list into this function"
    mylist = [1,2,3,4]; # This would assig new reference in mylist
    print "Values inside the function: ", mylist
    return
    # Now you can call changeme function
    mylist = [10,20,30];
    changeme[ mylist ];
    print "Values outside the function: ", mylist
    0
  • #!/usr/bin/python
    # Function definition is here
    def changeme[ mylist ]:
    "This changes a passed list into this function"
    mylist = [1,2,3,4]; # This would assig new reference in mylist
    print "Values inside the function: ", mylist
    return
    # Now you can call changeme function
    mylist = [10,20,30];
    changeme[ mylist ];
    print "Values outside the function: ", mylist
    1.
    #!/usr/bin/python
    # Function definition is here
    def changeme[ mylist ]:
    "This changes a passed list into this function"
    mylist = [1,2,3,4]; # This would assig new reference in mylist
    print "Values inside the function: ", mylist
    return
    # Now you can call changeme function
    mylist = [10,20,30];
    changeme[ mylist ];
    print "Values outside the function: ", mylist
    2

Bốn cách đầu tiên chỉ tạo một bản sao nông của danh sách gốc. Chúng chỉ hoạt động đối với danh sách đơn giản bao gồm các loại không thay đổi, ví dụ: danh sách int. Nếu bản thân phần tử danh sách là loại có thể thay đổi, chúng sẽ không hoạt động

Các nhà phát triển chuyển sang lập trình Python từ các ngôn ngữ khác như C ++ và Java thường bị nhầm lẫn bởi quá trình truyền đối số trong Python. Mô hình dữ liệu lấy đối tượng làm trung tâm và cách xử lý phân công của nó là nguyên nhân đằng sau sự nhầm lẫn ở cấp độ cơ bản.  

Trong bài viết này, chúng ta sẽ thảo luận về khái niệm về cách truyền giá trị theo tham chiếu trong Python và cố gắng hiểu các ví dụ về truyền tham chiếu trong Python

Truyền theo giá trị và truyền theo tham chiếu trong Python

Bạn có thể muốn đấm một cái gì đó sau khi đọc trước, vì vậy hãy chuẩn bị tinh thần. Mô hình truyền đối số của Python không phải là “Truyền theo giá trị” hay “Truyền theo tham chiếu” mà là “Truyền theo tham chiếu đối tượng”.  

Có thể hiểu các mô hình “Truyền theo giá trị”, “Truyền theo tham chiếu” và “Truyền theo tham chiếu đối tượng” bằng cách khám phá các hàm ví dụ dưới đây. Nhìn vào hai chức năng được xác định dưới đây

Python3




#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
3
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
4
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
5
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
6

#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
7______25
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
9
def my_fun[my_list]:
    my_list.append[1]

    return my_list


x = [1, 2, 3]
y = my_fun[x]

print[f"x: {x}, y: {y}"]
# x, y are both [1, 2, 3, 1]
0
 a = ["X", "Y"]
0
 a = ["X", "Y"]
1
 a = ["X", "Y"]
2
 a = ["X", "Y"]
1
 a = ["X", "Y"]
4
 a = ["X", "Y"]
5

#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
7______47
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
5

 

#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
3
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
30
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
5
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
6

#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
7____25
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
35____236
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
37

#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
7______47
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
5

 

#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
41
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
9
def my_fun[my_list]:
    my_list.append[1]

    return my_list


x = [1, 2, 3]
y = my_fun[x]

print[f"x: {x}, y: {y}"]
# x, y are both [1, 2, 3, 1]
0
#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
44
 a = ["X", "Y"]
5

 

#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
46____247

 

#!/usr/bin/python
# Function definition is here
def changeme[ mylist ]:
"This changes a passed list into this function"
mylist = [1,2,3,4]; # This would assig new reference in mylist
print "Values inside the function: ", mylist
return
# Now you can call changeme function
mylist = [10,20,30];
changeme[ mylist ];
print "Values outside the function: ", mylist
46____249

đầu ra

Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
3

Bây giờ, hãy cùng khám phá đoạn mã trên,

Biến không phải là đối tượng

Ở đây “a” là một biến trỏ đến một danh sách chứa phần tử “X” và “Y”. Nhưng bản thân “a” không phải là danh sách. Coi “a” là một nhóm chứa đối tượng “X” và “Y”.  

 a = ["X", "Y"]

 

Pass by Reference trong Python là gì?

Truyền theo tham chiếu có nghĩa là bạn phải truyền hàm [tham chiếu] cho một biến chỉ rằng biến đó đã tồn tại trong bộ nhớ.  

Ở đây, biến [cái xô] được truyền trực tiếp vào hàm. Biến hoạt động như một Gói đi kèm với nội dung của nó [các đối tượng]

 

Trong hình ảnh mã ở trên, cả “list” và “my_list” đều là cùng một biến vùng chứa và do đó đề cập đến chính xác cùng một đối tượng trong bộ nhớ. Bất kỳ hoạt động nào được thực hiện bởi hàm trên biến hoặc đối tượng sẽ được phản ánh trực tiếp bởi người gọi hàm. Chẳng hạn, hàm có thể thay đổi hoàn toàn nội dung của biến và trỏ nó vào một đối tượng hoàn toàn khác.  

 

Ngoài ra, hàm có thể gán lại nội dung của biến với tác dụng tương tự như bên dưới.  

 

Tóm lại, trong tham chiếu chuyển qua, hàm và người gọi sử dụng cùng một biến và đối tượng

Truyền theo giá trị trong Python là gì?

Theo cách tiếp cận này, chúng tôi chuyển một bản sao của các biến thực trong hàm dưới dạng tham số. Do đó, bất kỳ sửa đổi nào đối với các tham số bên trong hàm sẽ không phản ánh trong biến thực tế

 

Điều này cũng đúng với mọi thao tác được thực hiện bởi hàm trên biến hoặc đối tượng

 

Để tóm tắt các bản sao của các biến và các đối tượng trong ngữ cảnh của người gọi hàm là hoàn toàn bị cô lập

Các danh sách trong Python có được chuyển qua tham chiếu không?

Danh sách đã được truyền theo tham chiếu , trong đó tất cả các tên Python đều là tham chiếu và đối tượng danh sách có thể thay đổi.

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

Python luôn sử dụng các giá trị chuyển qua tham chiếu . Không có bất kỳ ngoại lệ. Bất kỳ phép gán biến nào có nghĩa là sao chép giá trị tham chiếu.

Chủ Đề