繁体   English   中英

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

[英]Temporary created during 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”相同。

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

for i in a迭代分配i在每个元件a

迭代

i = i.difference(x)创建 新对象 并指派i

分配

让我们一步一步:

  1. i.difference(x)不会修改ix 相反,它返回一个新集。
  2. i = i.difference(x) 重新绑定变量i以指向新集合。 它不会以任何方式影响列表的内容。
  3. a[idx] = i确实通过将其idx -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

是的,当你执行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])]

你使用set.difference()表明你不知道运算符-= for sets:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM