我有一个列表,其中包含我将独立处理的信息和7个数据集。
此列表包含以下内容
print header
[['Specimen_RawData_1.csv' '' '' '' '']
['Time' 'Extension' 'Load' 'Strain' 'True Strain']
['(s)' '(mm)' '(N)' '(%)' '(%)']]
现在我想创建一个包含其中7个条目的列表,并使用它编辑一些值。用'循环:'专门替换并清空字符串。 +数字对应的数字。
以下是我尝试这样做的方法。
我有我想要复制和编辑的列表
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轻松做到这一点,但我想了解这里发生了什么。
答案 0 :(得分:0)
您正在创建引用而不是副本,因此您要更改同一个对象:
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