好吧,如果你好奇的身份可以隨時查詢使用is
操作:
>>> help('is')
的原因,你的嘗試沒有工作是因爲你創造了外循環的字典,這樣的當然,你會遇到問題:
>>> mydict = {}
>>> for x in xrange(3):
... d = mydict
... print d is mydict
...
...
True
True
True
不管你有多少次添加的東西d
或mydict
,mydict
永遠是同一個對象。
其他人已經評論說你應該使用副本,但他們沒有解決你的根本問題 - 你似乎不瞭解引用類型。
在Python中,一切都是一個對象。有兩種基本類型 - 可變和不可變。不可變的對象就像字符串,數字和元組。不允許你在內存中修改這些對象:
>>> x = 3
>>> y = x
>>> x is y
True
現在x
和y
指向同一個對象(而不僅僅是具有相同的值)。
>>> x += 4
因爲3是一個整數的和不可改變的,這個操作不會修改了儲存於x
價值,其實際作用是增加了3〜4和發現,它導致值7,所以現在x
「點」到7
>>> y
3
>>> x
7
>>> x is y
False
>>> y = x
>>> x is y
True
隨着可變對象,您可以修改他們在的地方:
>>> mylist = [1,2,3]
>>> mylist[0] = 3
>>> mylist
[3, 2, 3]
你會有很多更容易的時間,如果你停止日在Python中引用變量作爲變量存儲值,而不是將它們當作名稱標籤 - 你知道那些說「你好,我的名字是」的那些?
所以,基本上你的代碼中發生的事情是,通過循環返回的對象每次都是相同的。
下面是一個例子:
>>> def spam_ref():
... thing = []
... count = 0
... while count < 10:
... count += 1
... thing.append(count)
... yield thing
...
>>> for a in spam_ref():
... print a
...
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> spam = []
>>> for a in spam_ref():
... spam.append(a)
...
所以,如果你看一下回路的輸出,你會認爲spam
現在包含
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
但事實並非如此:
>>> for a in spam:
... print a
...
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
因爲列表是可變的,所以生成器函數能夠修改它。在你的情況下,你有一個正在被返回的字典,所以正如其他人提到的那樣,你需要使用一些複製字典的方法。
如需進一步閱讀,請查閱Python Objects和Call By Object。
我不知道這樣的模塊存在。謝謝! –
@TomThorogood很高興我可以幫你 –