2015-11-10 102 views
1

我已经创建了一个python函数,它应该采用一系列3D坐标并将它们放置在列表中(在列表中)。list.append()似乎不能正常工作

然而,当我打印出来coord_list,它似乎并不正确添加,例如,当输入这些坐标:

[1,2,3] 

[2,3,4] 

[3,4,5] 

coord_list的最终输出(忽略“Q”)会是:[[3,4,5],[3,4,5],[3,4,5]]

为什么它不能正确追加,以及如何解决这个问题?

def coords() : 

    xyz_list = [] 
    coord_list = [] 

    while 1 : 
     xyz = raw_input("Enter co-ordinates (x,y,z) enter 'q' when done: ") 
     xyz = str(xyz) 

     del xyz_list[:] 

     for num in xyz.split(","): 
      xyz_list.append(num) 

     print xyz_list 

     if xyz[0] != 'q' : 
      coord_list.append(xyz_list) 
      print coord_list 
     else : 
      break 

coords() 
+0

我测试了你的脚本,没关系。 – Zety

+1

您能否更具体地说明“为什么不能正确追加”?你认为它应该做什么? – Erik

回答

1

问题在于访问托管堆的del。新对象(xyz_list的成员)出现在同一地点,因为包含列表未被删除。因此,列表成员在原来的位置替换了以前的列表,coord_list中的参考将指向新的值。

繁殖蟒蛇2.7.9(Linux)的:

$ python coords.py 

Enter co-ordinates (x,y,z) enter 'q' when done: 1,2,3 
['1', '2', '3'] 
[['1', '2', '3']] 
Enter co-ordinates (x,y,z) enter 'q' when done: 2,3,4 
['2', '3', '4'] 
[['2', '3', '4'], ['2', '3', '4']] 
Enter co-ordinates (x,y,z) enter 'q' when done: 3,4,5 
['3', '4', '5'] 
[['3', '4', '5'], ['3', '4', '5'], ['3', '4', '5']] 

我做了一个小改动剧本:del xyz_list[:] - >xyz_list = []

现在,它的工作原理:

def coords() : 

    xyz_list = [] 
    coord_list = [] 

    while 1 : 
     xyz = raw_input("Enter co-ordinates (x,y,z) enter 'q' when done: ") 
     xyz = str(xyz) 

     for num in xyz.split(","): 
      xyz_list.append(num) 

     print xyz_list 

     if xyz[0] != 'q' : 
      coord_list.append(xyz_list) 
      print coord_list 
      xyz_list = [] 
     else : 
      break 

coords() 

输出:

$ python coords.py 

Enter co-ordinates (x,y,z) enter 'q' when done: 1,2,3 
['1', '2', '3'] 
[['1', '2', '3']] 
Enter co-ordinates (x,y,z) enter 'q' when done: 2,3,4 
['2', '3', '4'] 
[['1', '2', '3'], ['2', '3', '4']] 
Enter co-ordinates (x,y,z) enter 'q' when done: 3,4,5 
['3', '4', '5'] 
[['1', '2', '3'], ['2', '3', '4'], ['3', '4', '5']] 
+1

谢谢,有时候一个简单的错误会让你疯狂 – tombam95

2

这是因为coord_list被存储[xyz_list, xyz_list, ...]。您在每次迭代中更新xyz_list,而这个迭代又在coord_list中更新。

1

它添加到coord_list后删除del和清除列表xyz_list

Enter co-ordinates (x,y,z) enter 'q' when done: 1,2,3 
['1', '2', '3'] 
[['1', '2', '3']] 
Enter co-ordinates (x,y,z) enter 'q' when done: 4,5,6 
['4', '5', '6'] 
[['1', '2', '3'], ['4', '5', '6']] 
0

我测试脚本,这是结果[['3','4','5'],[' 3','4','5'],['3','4','5']]

如果你想在列表中的整数,只是这样做:

for num in xyz.split(","): 
    xyz_list.append(int(num)) 

可能是你应该限制使用num, num, num用户。

相关问题