[英]Question about sliced arrays overriding dictionary assignment in python
我有以下代碼。 我正在嘗試使用鍵“ CH4”和“ NO”向字典添加numpy數組EPtmp(CH4填充為零,NO填充為1)。 在for循環的第一次迭代中,零數組與鍵CH4正確關聯。 在第二次迭代中,ones數組將覆蓋先前寫入的CH4鍵以及新的NO鍵的條目。 如果我從EPtmp [:] = EP中刪除切片,使其改為EPtmp = EP,則它將完美地工作而不會覆蓋先前寫入的數組。 這似乎與Python分配或訪問內存的方式有關,但是我還無法在文檔中找到任何內容來解釋這種行為。 為什么切片[:]會導致字典覆蓋?
import numpy as np
species_names = ['O2', 'CH4', 'NO', 'N2', 'O', 'CH3', 'H', 'HO2', 'N2O', 'NO2', 'NNH']
target_index_species = [1,2]
EP_spec_dict = {}
EPtmp = np.zeros(len(species_names),'d')
for index_target_local, index_target_global in enumerate(target_index_species):
EP = np.ones(len(species_names))*index_target_local
EPtmp[:] = EP
print("Going to add",species_names[index_target_global],"EP tmp",EPtmp)
EP_spec_dict[species_names[index_target_global]] = EPtmp
print("Full dict",EP_spec_dict)
EPtmp = EP
使EPtmp成為EPtmp = EP
的參考,這意味着如果更改EPtmp,則實際上是在更改EP,因為它們是同一陣列。
EPtmp[:]
= EP復制EP,因此更改EPtmp不會更改EP。
在控制台中嘗試以下操作:
a=[1,2]
b=[0,0]
a=b
a[0]=5
b
Out[13]: [5, 0]
和
a=[1,2]
b=[0,0]
a[:]=b
a[0]=5
b
Out[18]: [0, 0]
但是切片也可以相反。 如果您有b = a
,然后通過執行a = []來設置a,則b不會更改,因為您正在創建新的a。 但是,如果您不創建新的a而是用a[:]=[]
顯式覆蓋舊的a[:]=[]
,則b會更改。
嘗試:
a=[1,2]
b=a
c=b
a=[1,3] #doesn't change b and c
b[:]=[1,4] #changes c
基本上,a = b表示a是指向b在內存中指向的位置的指針,而a [:] = b表示將b指向的內容寫入其中。
因此,在您的示例中,字典包含指向EPtmp的指針。 由EP_spec_dict[species_names[index_target_global]] = EPtmp
現在,如果使用EPtmp=EP
制作一個新的EPtmp,則該EPtmp=EP
位於不同的內存部分中,並且EP_spec_dict[species_names[index_target_global]]
仍指向舊的EPtmp的內存部分。 但是,使用EPtmp [:] = EP,您只是覆蓋了EPtmp的內存內容,而沒有制作新的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.