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

Sid*_*Sid 5 python iteration list

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

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
Run Code Online (Sandbox Code Playgroud)

输出:

[set([1, 2, 3]), set([3, 4, 5])]
59672976 59672616
59672616 59672736
[set([2, 3]), set([3, 5])]
Run Code Online (Sandbox Code Playgroud)

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

NPE*_*NPE 2

让我们一步一步地进行:

  1. i.difference(x)不修改ix. 相反,它返回一个新集合。
  2. i = i.difference(x) 重新绑定变量i以指向新集合。它不会以任何方式影响列表的内容。
  3. a[idx] = iidx确实通过将其第 -th 元素设置为新集合来修改列表。

更干净的实现可能会使用不同的变量而不是重新调整用途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
Run Code Online (Sandbox Code Playgroud)