[英]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
。
讓我們一步一步:
i.difference(x)
不會修改i
或x
。 相反,它返回一個新集。 i = i.difference(x)
重新綁定變量i
以指向新集合。 它不會以任何方式影響列表的內容。 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.