在python列表迭代期间临时创建?

时间:2012-03-21 15:19:33

标签: python list iteration

我想了解为什么会发生以下情况。我的猜测是在列表迭代期间正在创建临时值,但是需要一些专家来确认:

def test():
    a=[set([1,2,3]),set([3,4,5])]
    x=set([1,4])
    for i in a:
        # doesn't actually modify list contents, making a copy of list elements in i?
        i=i.difference(x)
    print a
    for idx,i in enumerate(a):
        i=i.difference(x)
        print id(i),id(a[idx])
        # obviously this modifies the contents
        a[idx]=i
    print a

输出:

[set([1, 2, 3]), set([3, 4, 5])]
59672976 59672616
59672616 59672736
[set([2, 3]), set([3, 5])]

另外,我想理解为什么第二次迭代中i的“id”与[0]的“id”相同。

4 个答案:

答案 0 :(得分:4)

这有助于以图形方式查看,因为它基本上是一个指针问题。

for i in a迭代地为i中的每个元素指定a

iteration

i = i.difference(x)创建new object并为其分配i

assignment

答案 1 :(得分:2)

让我们一步一步:

  1. i.difference(x)不会修改ix。相反,它返回一个新集。
  2. i = i.difference(x) 重新绑定变量i以指向新集。它不会以任何方式影响列表的内容。
  3. a[idx] = i会通过将其idx - 元素设置为新集来修改列表。
  4. 更干净的实现可能使用不同的变量而不是重新使用i

    def test():
        a=[set([1,2,3]),set([3,4,5])]
        x=set([1,4])
        for i in a:
            diff=i.difference(x)
            # a[idx]=diff
        print a
    

答案 2 :(得分:2)

是的,当您执行i=i.difference(x)时,它会创建一个新的i。只需像这样修改你的代码就可以了解发生了什么 -

def test():
    a=[set([1,2,3]),set([3,4,5])]
    x=set([1,4])
    for i in a:
        # doesn't actually modify list contents, making a copy of list elements in i?
        print 'old i - ', id(i)
        i=i.difference(x)
        print 'new i - ', id(i)
    print a

test()

输出 -

old i -  4467059736
new i -  4467179216
old i -  4467177360
new i -  4467179216
[set([1, 2, 3]), set([3, 4, 5])]

答案 3 :(得分:1)

您使用set.difference()表示您不知道集合的运算符-=

def test():
    a=[set([1,2,3]),set([3,4,5])]
    x=set([1,4])
    for i in a:
        i -= x
    print a

这表明i只是指向要修改的集合的另一个指针。只是不要覆盖你的指针!