30/09/2018, 22:09

List 2D trong Python

box=[]
values=[]
for i in range(2):
    values.append('-')
for i in range(2):
    box.append(values)
box[0][1]='P'
print (box)

Sao lúc chạy nó in ra :
[[’-’, ‘P’], [’-’, ‘P’]]
nhỉ ạ?
để nó in ra
[[’-’, ‘P’], [’-’, ‘-’]] thi làm thế nào ạ?

Gió viết 00:21 ngày 01/10/2018

2 cái giống nhau là do cùng gán đến values. Để tạo một values khác của box, bạn thêm dòng này trước box.append
values=[] và chuyển vòng for khởi tạo cho values xuống dưới dòng đó

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

Python truy cập đến list thông qua reference cho nên khi bạn

for i in range(2):
    box.append(values)

thực ra bạn chỉ thêm vào box 2 references đến cùng một object values duy nhất. Vì thế, bạn thay đổi values kiểu gì thì 2 phần tử của box cũng luôn giống y sì nhau. Để tránh điều này, bạn có thể copy values ra một object khác nhưng cùng giá trị

# version 1
box=[]
values=[]
for i in range(2):
    values.append('-')
for i in range(2):
    box.append(values)

print(box[0] == box[1])  # True
print(box[0] is box[1])     # True

# version 2
box = []
values = []
for i in range(2):
    values.append('-')
for i in range(2):
    box.append(values.copy())  # or
    box.append(values[:])  # or
    box.append(list(values))

print(box[0] == box[1])  # True
print(box[0] is box[1])     # False
Bài liên quan
0