簡體   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