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.