我一直在研究下面显示的udacity代码。我试图找出为什么当通过调用list(p)创建'g'时,列表'g'和'p'作为相同的列表。当在移动函数中调用print语句(print [i] [j])时,它表示当'g'被改变时'p'被覆盖。我刚开始用python编程,我很感激任何帮助。提前谢谢。
colors = [['red', 'green', 'green', 'red' , 'red'],
['red', 'red', 'green', 'red', 'red'],
['red', 'red', 'green', 'green', 'red'],
['red', 'red', 'red', 'red', 'red']]
measurements = ['green', 'green', 'green' ,'green', 'green']
motions = [[0,0],[0,1],[1,0],[1,0],[0,1]]
sensor_right = 0.7
p_move = 0.8
def show(p):
for i in range(len(p)):
print p[i]
total = len(colors[0])*len(colors)
for i in range(len(colors)):
p.append([])
for j in range(len(colors[i])):
p[i].append(1./total)
print p
def move(g,c,r):
t = list(g)
for i in range(len(g)):
for j in range(len(g[i])):
print p[i][j]
t[i][j] = t[(i-c)%len(g)][(j-r)%len(g[i])] * p_move
print p[i][j]
s = sum_table(t)
for i in range(len(g)):
for j in range(len(list(g[i]))):
t[i][j] /= s
return t
def sum_table(g):
sum = 0
for i in range(len(g)):
for j in range(len(g[i])):
sum += g[i][j]
print sum
return sum
move(list(p),0,1)
print p
答案 0 :(得分:7)
我没有详细介绍您的代码,但您的麻烦来源可能是使用二维数据结构(列表列表)。在Python中,list()
构造函数是浅拷贝,它只复制一个级别的列表。您可以在适当的情况下使用copy.deepcopy()
功能来避免您遇到的问题。
一个技巧是使用id(p)
和id(g)
来找出每个引用的实际对象标识。这种调试可能有助于隔离您的问题。你正在调用list()
构造函数,可能远远超过必要的。创建这样的数据结构的不必要的副本将为CPU做更多的工作,并且可能影响性能关键代码。