簡體   English   中英

了解使用列表編輯列表的行為

[英]Understanding Behavior of Editing aList withing a List

我有一個列表,其中包含我將獨立處理的信息和7個數據集。

此列表包含以下內容

print header
[['Specimen_RawData_1.csv' '' '' '' '']
['Time' 'Extension' 'Load' 'Strain' 'True Strain']
['(s)' '(mm)' '(N)' '(%)' '(%)']]

現在,我想創建一個包含7個條目的列表,並編輯其中的一些值。 專門用'Cycle:'+對應於數據集的數字替換並清空字符串。

這就是我正在嘗試做的事情。

我有要復制和編輯的列表

header

我將其復制到一個臨時變量

tempHeader

然后我對列表tempHeader的內容進行一些更改

然后我將臨時變量附加到

newHeader


newHeader = []
for i in range(len(dirChange_index)/2):
    tempHeader =[]
    tempHeader = header
    # Want to replace a locaton in the list with the value Cycle i
    tempHeader[0][1] = 'Cycle: ' + str(i+1)
    print tempHeader
print '--'
    newHeader.append([tempHeader])    
print newHeader

這表明我已成功更改了臨時列表中的值。

[['Specimen_RawData_1.csv' 'Cycle: 1' '' '' '']
['Time' 'Extension' 'Load' 'Strain' 'True Strain']
['(s)' '(mm)' '(N)' '(%)' '(%)']]

[['Specimen_RawData_1.csv' 'Cycle: 2' '' '' '']
['Time' 'Extension' 'Load' 'Strain' 'True Strain']
['(s)' '(mm)' '(N)' '(%)' '(%)']]

[['Specimen_RawData_1.csv' 'Cycle: 7' '' '' '']
['Time' 'Extension' 'Load' 'Strain' 'True Strain']
['(s)' '(mm)' '(N)' '(%)' '(%)']]

我不了解的行為是,當我將臨時變量附加到增長列表時,它也會替換所有先前的值。

print newHeader
[[array([['Specimen_RawData_1.csv', 'Cycle: 7', '', '', ''],
   ['Time', 'Extension', 'Load', 'Strain', 'True Strain'],
   ['(s)', '(mm)', '(N)', '(%)', '(%)']], 
  dtype='|S26')], [array([['Specimen_RawData_1.csv', 'Cycle: 7', '', '', ''],
   ['Time', 'Extension', 'Load', 'Strain', 'True Strain'],
   ['(s)', '(mm)', '(N)', '(%)', '(%)']], 
  dtype='|S26')], [array([['Specimen_RawData_1.csv', 'Cycle: 7', '', '', ''],
   ['Time', 'Extension', 'Load', 'Strain', 'True Strain'],
   ['(s)', '(mm)', '(N)', '(%)', '(%)']], 
  dtype='|S26')], [array([['Specimen_RawData_1.csv', 'Cycle: 7', '', '', ''],
   ['Time', 'Extension', 'Load', 'Strain', 'True Strain'],
   ['(s)', '(mm)', '(N)', '(%)', '(%)']], 
  dtype='|S26')], [array([['Specimen_RawData_1.csv', 'Cycle: 7', '', '', ''],
   ['Time', 'Extension', 'Load', 'Strain', 'True Strain'],
   ['(s)', '(mm)', '(N)', '(%)', '(%)']], 
  dtype='|S26')], [array([['Specimen_RawData_1.csv', 'Cycle: 7', '', '', ''],
   ['Time', 'Extension', 'Load', 'Strain', 'True Strain'],
   ['(s)', '(mm)', '(N)', '(%)', '(%)']], 
  dtype='|S26')], [array([['Specimen_RawData_1.csv', 'Cycle: 7', '', '', ''],
   ['Time', 'Extension', 'Load', 'Strain', 'True Strain'],
   ['(s)', '(mm)', '(N)', '(%)', '(%)']], 
  dtype='|S26')]]

我在這里想念什么。 似乎我誤解了列表和數組中的一些基本知識。 我想我可以用numpy輕松地做到這一點,但是我想了解這里發生了什么。

您正在創建引用而不是副本,因此您要更改同一對象:

tempHeader = header # <- reference to object

您需要對列表列表進行deepcopy

from copy import deepcopy
tempHeader = deepcopy(header)  # completely new object

您可以在檢查對象標識時看到它們都指向內存中的相同位置:

In [17]: l = [[1,2,3],[4,5,6]]

In [18]: id(l)
Out[18]: 140365355535048

In [19]: id(l[0])
Out[19]: 140365355537608

In [20]: l1 = l

In [21]: id(l1)
Out[21]: 140365355535048

In [22]: id(l1[0])
Out[22]: 140365355537608
In [23]: l is l1
Out[23]: True

現在實際制作一個副本:

In [24]: from copy import  deepcopy

In [25]: l = [[1,2,3],[4,5,6]]

In [26]: id(l)
Out[26]: 140365355535688

In [27]: id(l[0])
Out[27]: 140365355559112

In [28]: l1 = deepcopy(l)

In [29]: id(l1)
Out[29]: 140365355561928

In [30]: id(l1[0])
Out[30]: 140365355562824

In [31]: l is l1
Out[31]: False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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