进入for循环后,为什么p [1]的值立即为'0'?

时间:2016-03-12 09:49:02

标签: python

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? *

1 个答案:

答案 0 :(得分:1)

因为qp引用了相同的列表。因此,通过变量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中显示。这是因为pq绑定到相同的列表变量:

>>> 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没有变化。