在Python中,我在處理itertools groupby模塊時遇到了這個奇怪的現象。爲什麼這個分配的對象與原始對象共享相同的內存空間?
在Python中,變量賦值意味着分配新的變量自己的內存,而不是一個指向原來的內存(從我的理解,如果這是不正確,請讓我知道):
y = 7
x = y
y = 9
x will still be 7
然而,當我是與groupby模塊一起工作時,我使用此模塊將具有相同密鑰的項目分組到一個組中。我想要兩個組,因爲對原始組的重申是無用的,因爲內存已經被修改了。例如:
for key, group in groupby(rows, lambda x: x[0]):
data = [thing[1] for thing in group] #accesses 1st attribute of element
data2 = [thing[2] for thing in group] # would yield [] as group is empty
所以,我想這個代替:
for key, group in groupby(rows, lambda x: x[0]):
#create a copy of group to reiterate over
toup = group
print toup #<itertools._grouper object at 0x1039a8850>
print group #<itertools._grouper object at 0x1039a8850>
data = [thing[1] for thing in group] #accesses 1st attribute of element
data2 = [thing[2] for thing in toup]
數據2應該進入第二個項目,但收益率[],因爲他們都共享同一個存儲
我的問題是,爲什麼會發生這種情況?不應該指派組來toup意味着toup會在不同的十六進制地址位置有組內存的副本?
另外我能做些什麼來繞過這個問題,所以我不必寫兩個groupby迭代?
它取決於變量的類型。如果將整數和字符串分配給另一個變量,則實例對象不是 - 變量將變爲對實例對象的引用。嘗試「a = []; b = a;打印(a是b)」 - 這將打印爲True。 – 2014-09-04 16:20:17
*「變量賦值意味着賦給新變量自己的內存,而不是指向原始內存的指針」* - 不正確,這不是Python名稱的工作方式(請參閱http://nedbatchelder.com/text/names.html) 。使用'toup = group [:]'創建一個副本。 – jonrsharpe 2014-09-04 16:23:02
@這是不正確的(首先,Python沒有真正的基元,例如整數*就是*實例);不同之處在於例如整數是不可變的,而例如列表是可變的。 'a = 1; b = a; a是b'仍然*是'真',只是'b + = 1'不會影響'a'(因爲整數是不可變的)。 – jonrsharpe 2014-09-04 16:24:14