python函数在这里:
def rot(p):
q = p
print "P val: ", p, "len(p): ", len(p)
for i in range(len(p)):
if (i == (len(p)-1)):
q[0] = p[i]
print "P val if: ", p, "p(i) : " , p[i]
else:
q[i+1] = p[i]
print "P val else: ", p, "p(i) : " , p[i]
return q
输出在这里:
P val: [0, 1, 0, 0, 0] len(p): 5 P val else: [0, 0, 0, 0, 0] p(i) : 0 P val else: [0, 0, 0, 0, 0] p(i) : 0 P val else: [0, 0, 0, 0, 0] p(i) : 0 P val else: [0, 0, 0, 0, 0] p(i) : 0 P val if: [0, 0, 0, 0, 0] p(i) : 0
*问题是,为什么列表p在进入for循环后将其p [1]值改为0? *
答案 0 :(得分:1)
因为q
和p
引用了相同的列表。因此,通过变量q
对列表所做的任何更改也将反映在变量p
中,因为它们都代表相同的基础列表。例如:
>>> p = [1, 2, 3]
>>> q = p
>>> q
[1, 2, 3]
>>> q[0] = 0
>>> q
[0, 2, 3]
>>> p
[0, 2, 3]
这表明通过q
进行的更新也会在p
中显示。这是因为p
和q
绑定到相同的列表变量:
>>> p is q
True
修复
使用切片表示法处理p
的副本:
def rot(p):
q = p[:] # copy p
... # rest of your function...
>>> l = [0, 1, 0, 0, 0]
>>> rot(l)
P val: [0, 1, 0, 0, 0] len(p): 5
P val else: [0, 1, 0, 0, 0] p(i) : 0
P val else: [0, 1, 0, 0, 0] p(i) : 1
P val else: [0, 1, 0, 0, 0] p(i) : 0
P val else: [0, 1, 0, 0, 0] p(i) : 0
P val if: [0, 1, 0, 0, 0] p(i) : 0
[0, 0, 1, 0, 0]
>>> l
[0, 1, 0, 0, 0]
l
没有变化。