首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解使用列表编辑aList的行为

理解使用列表编辑aList的行为
EN

Stack Overflow用户
提问于 2015-03-12 18:37:59
回答 1查看 34关注 0票数 2

我有一个清单,包含信息和7个数据集,我将独立处理。

此列表包含以下内容

代码语言:javascript
复制
print header
[['Specimen_RawData_1.csv' '' '' '' '']
['Time' 'Extension' 'Load' 'Strain' 'True Strain']
['(s)' '(mm)' '(N)' '(%)' '(%)']]

现在,我想创建一个包含7个条目的列表,并使用它编辑一些值。特别地,用与数据集相对应的“循环:”+数字替换和空字符串。

我就是这么做的。

我有要复制和编辑的列表

代码语言:javascript
复制
header

我将它复制到一个临时变量。

代码语言:javascript
复制
tempHeader

然后对列表tempHeader的内容进行一些更改。

然后,我将临时变量追加到

代码语言:javascript
复制
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

这表明我正在成功地更改临时列表中的值。

代码语言:javascript
复制
[['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)' '(%)' '(%)']]

。。。

代码语言:javascript
复制
[['Specimen_RawData_1.csv' 'Cycle: 7' '' '' '']
['Time' 'Extension' 'Load' 'Strain' 'True Strain']
['(s)' '(mm)' '(N)' '(%)' '(%)']]

我不理解的行为是,当我将临时变量附加到增长列表时,它也会替换所有以前的值。

代码语言:javascript
复制
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来做这件事,但是我想了解这里发生了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-12 18:46:32

您正在创建引用,而不是副本,因此您要更改相同的对象:

代码语言:javascript
复制
tempHeader = header # <- reference to object

你需要对你的列表做一个deepcopy

代码语言:javascript
复制
from copy import deepcopy
tempHeader = deepcopy(header)  # completely new object

当您检查对象标识时,可以看到它们都指向内存中的相同位置:

代码语言:javascript
复制
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

现在实际制作一个副本:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29017733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档