01/10/2018, 08:41

Dict trong python

mình mới tập tành học lập trình python, mọi người cho mình hỏi đoạn code sau nha:

dict1 = {‘Ten’: ‘Nam’, ‘Tuoi’: 7}
print dict1

a = dict1
a [‘Ten’] = “bill”
print a
print dict1

Output:
{‘Tuoi’: 7, ‘Ten’: ‘Nam’}
{‘Tuoi’: 7, ‘Ten’: ‘bill’}
{‘Tuoi’: 7, ‘Ten’: ‘bill’}

tại sao khi gán a = dict1 và thay đổi key “Ten” thì key “Ten” của dict1 cũng thay đổi theo vậy.
Như theo kết quả thì khi ta cho a = dict1, giống như là tạo một name khác cho dict1 vậy và cũng trỏ về nơi chứa kết quả của dict1 (giống softlink trong linux). Cách gán này có tác dụng gì khi lập trình, khác gì với khi gán bình thường. Cảm ơn mọi người

Lương Quang Mạnh viết 10:47 ngày 01/10/2018

Trong Python, tất cả các phép gán thông thường đều đơn thuần chỉ là tạo thêm một reference cho một object ban đầu. Hiểu nôm na là tạo “nickname” cho một object hay từa tựa “pointer” trong C/C++ vậy.
Dù có bao nhiêu tên đi chăng nữa thì nó cũng chỉ đến một object duy nhất.

Về phần tác dụng, theo mình thì ưu điểm của nó là tránh việc phải tạo ra các bản copy của object một cách không cần thiết.

Tuan viết 10:57 ngày 01/10/2018

ah thanks bạn nha, nhưng thế này thì sao:

a = 1
b = a
b=2
print a

output: 1
==> trong trường hợp này a vẫn bằng 1 mà ko phải là 2 như b. Khác gì so với trường hợp trên vậy.

Thành Phạm viết 10:52 ngày 01/10/2018

cái đó là

Khởi tạo 1 đối tượng kiểu số nguyên, giá trị là 1, gán vào biến a
Gán biến b vào đối tượng số nguyên đó, nên b có giá trị là 1
Khởi tạo 1 đối tượng kiểu số nguyên, giá trị là 2, gán vào biến b

Nên b có giá trị là 2, kiểu như bạn đặt tên vậy đó, bạn có 1 ngôi nhà, bạn đặt tên nhà đó là a, xong 1 người khác đặt tên cho cũng ngôi nhà đó là b (1 ngôi nhà có 2 tên), xong người đó chán, đổi tên b cho ngôi nhà khác.

Còn trường hợp dict thì bạn đặt tên ngôi nhà đó là dict1, 1 người khác đặt tên ngôi nhà đó là a, rồi bạn gọi điện cho 1 công ty sơn nào đó: “alo đến sơn lại ngôi nhà tên là dict1 thành màu xanh”, xong người kia lại gọi cho công ty sơn: “alo đến sơn lại ngôi nhà tên a thành màu đó”. Vậy là nhà từ màu xanh thành màu đỏ

Để ý là có “ngôi nhà” sơn lại được có cái thì không (immutable and mutable)
Gợi ý tiếp 2 keyword nữa để b nghịch thử là shallow copy and deep copy

Lương Quang Mạnh viết 10:46 ngày 01/10/2018

Lúc đầu, cả a và b chỉ tới object 1. Lúc sau, b chỉ tới object 2, trong khi a vẫn chỉ tới object 1.
So với đoạn code lúc đầu của bạn thì đoạn code trên đây nó giống thế này hơn này:

a = {'hello': 'world'}  # một object
b = a
b = {'goodbye': 'world'}  # object khác
print(a)  # {'hello': 'world'}
print(b)  # {'goodbye': 'world'}

Còn đoạn code đầu tiên:

dict1 = {'Ten': 'Nam', 'Tuoi': 7}
a = dict1  # vẫn chỉ là một object duy nhất, tạm gọi là O
a['ten'] = 'Bill'  # object O về bản chất đã bị biến đổi nên gọi bằng
# tên nào (a hay dict1) cũng thế cả
Tuan viết 10:42 ngày 01/10/2018

giờ thì hiểu rồi, thanks mọi người nhiều nha

Bài liên quan
0