Shallow Copy trong Python

Xin chào
Mình có đoạn code như sau, mong được giải đáp.

a=[10,23,56,[78]]
b=list(a)
print(id(a), id(b))
a[3][0]=95
a[1]=34
print(b)

kết quả

2535939400328 2535942547784
[10, 23, 56, [95]]

Ta thấy id của 2 obj a và b đã khác nhau, nhưng ở phép gán a[3][0]=95 lại làm phân từ cùng chỗ trên b thay đổi.WTF???
:smile: Ngôn ngữ linh động quá, cao cấp qua nhiều khi lại khó hiểu.

Xin cảm ơn

Copy list(a) đâu có liên quan gì đến a[3] đâu, a[3] với b[3] bên trong vẫn trỏ vào 1 chỗ mà :kissing:

Gọi hàm thôi.

https://docs.python.org/3/library/copy.html

Thêm về shallow copy

http://xahlee.info/python/copy_a_list.html

What’s Shallow Copy?

All the following only does shallow copy:

  • ℓ2 = ℓ.slice(…)
  • ℓ2 = ℓ.extend(…)
  • ℓ2 = list(ℓ)

They only create a copy on the 0th level. That’s called shallow copy. The elements of a nested element are copied by reference.

2 Likes

Nghĩa là sau khi ta dùng hàm khởi tạo b=list(a)
Thì nó sẽ chép các phần tử trong a qua b, nhưng phần tử cuối cùng là 1 địa chỉ???
Nên khi thay đổi địa chỉ này thì đổi cả 2?

image

Mình hiểu r, tks bạn :wink:

Sai rồi, chú thích nói rõ mà

They only create a copy on the 0th level.

Và nói tới list thì có thể hiểu ở đa số ngôn ngữ lập trình nó là danh sách 1 cấp

2 Likes

Còn đoạn sau mà.

The elements of a nested element are copied by reference.

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