python 组合问题出现的错误

aiqier627 2013-01-07 12:17:58

我想要写一个函数能通过顶点和长宽高找到一个长方体八个顶点的坐标。
# x, y, z
v = ['x', 'y', 'z']

# length width height
th = ['L','W','H']

vertex = [None]*3

def ver(i):
if i <0 and vertex != []:
print vertex
else:
for x in ['+','-']:
t = v[i] + x + th[i] + ‘/2’
vertex[i] = t
ver(i-1)
['x+L/2', 'y+W/2', 'z+H/2']
['x-L/2', 'y+W/2', 'z+H/2']
['x+L/2', 'y-W/2', 'z+H/2']
['x-L/2', 'y-W/2', 'z+H/2']
['x+L/2', 'y+W/2', 'z-H/2']
['x-L/2', 'y+W/2', 'z-H/2']
['x+L/2', 'y-W/2', 'z-H/2']
['x-L/2', 'y-W/2', 'z-H/2']

就像是八皇后那样的方法,但是当我想把他们结果保存起来,而不是打印时,就不对了。

# x, y, z
v = ['x', 'y', 'z']

# length width height
th = ['L','W','H']

vertex = [None]*3

res = []
def ver(i):
if i <0 and vertex != []:
res.append(vertex)
else:
for x in ['+','-']:
t = v[i] + x + th[i]+'/2'
vertex[i] = t
ver(i-1)

ver(2)

print res
现在的res全都是['x-L/2', 'y-W/2', 'z-H/2']
[['x-L/2', 'y-W/2', 'z-H/2'], ['x-L/2', 'y-W/2', 'z-H/2'], ['x-L/2', 'y-W/2', 'z-H/2'], ['x-L/2', 'y-W/2', 'z-H/2'], ['x-L/2', 'y-W/2', 'z-H/2'], ['x-L/2', 'y-W/2', 'z-H/2'], ['x-L/2', 'y-W/2', 'z-H/2'], ['x-L/2', 'y-W/2', 'z-H/2']]

请问是为什么?
...全文
80 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ImN1 2013-01-07
  • 打赏
  • 举报
回复
试一下:

def ver(i):
    if i <0 and vertex != []:
        res.append(vertex)
    else:
    for x in ['+','-']:
        t = v[i] + x + th[i]+'/2'
        vertex[i] = t
        return ver(i-1)
    return
bugs2k 2013-01-07
  • 打赏
  • 举报
回复
程序运行完就是这个计算出这个结果啊。 你期望得到什么样的结果?
ImN1 2013-01-07
  • 打赏
  • 举报
回复
引用 3 楼 angel_su 的回复:
按结果res的每个元素都是同一对象,所以应该res.append(vertex[:])添加vertex副本当元素,这个副本就是另一个新对象,不会再跟着vertex变化...
学习了,刚看到一个文章也是说函数内释放列表,也是要用a[:]而不是变量a,应该是同一个道理……
angel_su 2013-01-07
  • 打赏
  • 举报
回复
按结果res的每个元素都是同一对象,所以应该res.append(vertex[:])添加vertex副本当元素,这个副本就是另一个新对象,不会再跟着vertex变化...

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧