簡體   English   中英

關於切片數組在python中覆蓋字典分配的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM