Xin hỏi về vòng lập for

Xin chào mọi người em đang viết một bài python khi cho 1 hàm vào vòng lập for hoặc đã chạy hàm trong for thì cho kết quả khác với hàm đó mà không có vòng lập đã chạy.Cho em hỏi tại sao nó lại chạy như vậy và cách sửa ạ.Cảm ơn mọi người .

1 Like

Chào bạn,
Bạn có thể gửi cho mình source code trong text file(cả những hàm bạn sử dụng nhưng không có source như sapxep(), mang(), mang1() …). Mình không nghĩ có sự khác biệt như vậy vì hàm ac() trả về list b, nhưng ngay từ đầu list b đã bị đưa về rỗng. Nên kết quả trả về chắc chắn là như nhau.

import numpy as np
import random
row = 4
col = 4
q_values = np.zeros((row, col))
def rd():
x =random.choice([‘2’, ‘4’])
return x
#*******************************************************
def xs(x):
a=[]
b=len(x)
for i in range(b):
if x[i]!=0:
a.append(x[i])
return a
def xs1(g):
a=xs(g)
b=len(a)
reward=0
for i in range(b-1):
if a[i]==a[i+1]:
a[i]=a[i]2
a[i+1]=0
reward=reward+10
return a,reward
def sapxep(x):
m=xs(x)
b=xs1(m)
m=b[0]
m=xs(m)
a=len(m)
if a<4:
for i in range(4-a):
m.append(0)
return m
#
********************************************************
def mang(a):
b = np.zeros((4, 4))
for i in range(4):
for ii in range(4):
b[i][ii]=a[i][ii]
return b
def mang1(a):
b = np.zeros((4, 4))
for i in range(4):
for ii in range(4):
b[i][ii]=a[ii][i]
return b
#*********************************************************
def ac(a,map):
b=[]
if a==0:
for i in range(4):
b.append(sapxep(map[i]))
b=mang(b)
if a==1:
for i in range(4):
j=map[i]
j.reverse()
h=sapxep(j)
h.reverse()
b.append(h)
b=mang(b)
if a==2:
for i in range(4):
c=[]
for ii in range (4):
c.append(map[ii][i])
b.append(sapxep©)
b=mang1(b)
if a==3:
for i in range(4):
c=[]
for ii in range (4):
c.append(map[ii][i])
c.reverse()
g=sapxep©
g.reverse()
b.append(g)
b=mang1(b)
return b
map =([
[3, 3, 0, 0],
[1, 1, 3, 0],
[1, 1, 0, 1],
[0, 1, 3, 2]])
print(ac(3,map))

1 Like

link code nha bạn : https://drive.google.com/file/d/1erDwHRi-cQbj2ddCJvZX7xdZCcreOh17/view?usp=sharing

1 Like

Chào bạn,
Lỗi của bạn rất cơ bản là bạn đã tạo ra một tham chiếu của map chứ không phải một bản copy của map.
Vì vậy khi chạy qua hàm ac() khi a==1, câu lệnh j.reverse() đã đảo ngược thứ tự các phần tử trong j do j là tham chiếu map nên làm map không còn là một chuỗi như ban đầu mà trở thành
[[0, 0, 3, 3], [0, 3, 1, 1], [1, 0, 1, 1], [2, 3, 1, 0]]
tức là map cũng bị đảo ngược. Nên khi bạn chạy vòng lặp for qua giá trị a==1 sẽ khiến cho map bị biến đổi.
Để tránh trường hợp này bạn nên tạo ra bản copy của map rồi mới reverse.
Lưu ý: Không nên dùng tên những hàm built_in của Python làm tên biến hay tên đối số, map là tên một keyword trong python.

Cảm ơn bạn .Chúc bạn 1 ngày vui vẻ

1 Like

Để hiểu hơn về tham chiếu trong python bạn có thể đọc hai bài.