List biến đổi khi qua hàm?

Em copy lại câu trả lời của 1 anh trong post trước cho mọi người tham khảo:

def func1(b):
    b.clear() // thao tác trên vùng nhớ (X)

def func2(b):
    b = []     // b được trỏ đến vùng nhớ (Y)
    b[0] = 1 // thao tác trên vùng nhớ (Y)

TH1: Khi bạn sử dụng func1 :
lúc này Python sẽ thực hiện tạo mới 1 biến b tại được lưu tại vùng nhớ (B) và trỏ đến vùng nhớ (A)
Diễn giải trong bộ nhớ lúc này sẽ như sau.
a = (A) -> (X)
b = (B) -> (X)
vì a và b đều cùng trỏ đến (X) do đó mọi thao tác bởi các method đều sẽ được “đồng bộ”. thay đổi ở b sẽ thay đổi ở a

TH2: khi bạn sử dụng func2 . Tình hình sẽ hơi khác chút. Ban đầu thì mọi thứ cũng sẽ giống func1 .
diễn giải bộ nhớ trước khi line b = [] được thực thi
a = (A) -> (X)
b = (B) -> (X)
lệnh gán b = [] sẽ tạo mới 1 vùng nhớ (Y), sau đó giá trị mà b nắm giữ sẽ được tráo đổi sang trỏ tới vùng nhớ (Y)
Diễn giải trong bộ nhớ lúc này sẽ như sau.
a = (A) -> (X)
b = (B) -> (Y)
vì a và b hiện tại đã trỏ tới 2 vùng nhớ khác nhau do đó mọi thao tác trên b sẽ không phản ảnh lại cho a.

-> Reply:
Đại khái là khi em clear() thì nó access same memory với vùng nhớ ngoài nên khi clear() nó thao tác trên cả biến global, còn = [] thì bản chất là em chỉ trỏ đến vùng mới thôi.
Có 1 câu anh đó nói về các vấn đề em đang mắc phải là:
"bản chất của biến (variable) chính là bộ nhớ RAM, bản chất của câu lệnh(function, operator, …) là CPU” Tuy nhiên em vẫn chưa hiểu ý nghĩa của câu này lắm.
#comment: Em tag nhầm.

1 Like

Chắc bạn còn lấn cấn vì sao ko update cái tham chiếu. Trong Python chỉ có “name” và đối tượng (Java còn có primitive), tức là có tạo ra bao nhiêu tham chiếu cho 1 đối tượng thì cũng chỉ có 1 đối tượng mà thôi. Vì vậy bạn chỉ truyền đi có mỗi cái “tên” mà thôi :smiley: nhưng tham chiếu đó sẽ trỏ đến đối tượng (None cũng là đối tượng), rồi bạn muốn làm gì thì làm. Phần còn lại là mutable/immutable mà thôi.

Thuật ngữ đúng và hay dùng nhất là “call by object reference”.

3 Likes

Dạ đúng rồi ý em dạng như

def hamA(a_list):
   ....
   ....

print(hamA(listA)) chẳng hạn, thì listA được truyền đến cho a_list, sau đó tùy thuộc vào là kiểu dữ liệu gì thì nó sẽ mutable hay không

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?