URN Logo
UNIX Resources » Linux » China Linux Forum » Python 编 程 » 9 » 函数中的一个list返回前和返回后完全不一样
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
函数中的一个list返回前和返回后完全不一样
 
 
 
 
 
 
Subject: 函数中的一个list返回前和返回后完全不一样
Author: gutounan    Posted: 2005-06-03 19:15    Length: 4,953 byte(s)
[Original] [Print] [Top]
在下写了个程序用来解这个题目http://blog.sina.com.tw/archive.php?blog_id=5095&md=en
try&id=5875
大家不用仔细看我的程序,写的很糟糕
我只是有一个地方很困惑,我分别标记了'mygod1'和'mygod2'
在guess_it函数内打印出来的是正确的,然后返回这个list
可是在'mygod2'那一行打印的时候完全不是刚才返回的那个list
也就是说一个对象在返回前后返回后完全不一样了,对象的id也不一样
请问这是怎么回事情?


#!/usr/bin/env python
import copy,sys
ALLDATA=range(1,10)

def printall(val):
for i in val:
for j in i:
print j,' ',
print ''

def getexist(val):
zz = []
for i in val:
if len(i) == 1:
zz.append(i[0])
return zz

def getvnexist(val, n):
zz = []
for i in val:
if len(i[n]) == 1:
zz.append(i[n][0])
return zz

def get_union(v1,v2):
zz=[]
for i in ALLDATA:
if i not in v1 and i not in v2:
zz.append(i)
if not zz:
print '-----------------------------------'
return zz

def oplist(val):
for i in val:
n = 0
ln_exist = getexist(i)
while n < len(i):
if len(i[n]) != 1:
vn_exist = getvnexist(val, n)
i[n] = get_union(ln_exist, vn_exist)
n += 1

def has_repeat(val):
for i in val:
if val.count(i) != 1:
print 'fail 5',i,val
return True
return False

def is_bad(val):
if not val:
return True
for i in val:
if has_repeat(getexist(i)):
print 'fail 3',i
return True
for j in i:
if len(j) < 1:
print 'fail 4'
return True
n = 0
val_len = len(val[0])
while n < val_len:
if has_repeat(getvnexist(val, n)):
return True
n += 1
return False

def all_ok(val):
if not val:
return False
for i in val:
for j in i:
if len(j) != 1:
return False
if i.count(j) != 1:
return False
n = 0
while n < len(val[0]):
zz = getvnexist(val, n)
for i in zz:
if zz.count(i) != 1:
return False
n += 1
return True

def guess_it(val):
#print 'gogogo'
#printall(val)
if not val:
#print 'fail 1'
return []
elif is_bad(val):
#print 'fail 2'
return []
elif all_ok(val):
printall(val) #mygod1
print 'OOOOOOOOOOOOOOKKKKKKKKKKKKKKKKKKK',id(val)
return val
for i in val:
indexi = val.index(i)
for j in i:
indexj = i.index(j)
lenj = len(j)
if lenj > 1:
get_copy = copy.deepcopy(val)
bakj = copy.copy(j)
nn = 0
while nn < lenj:
#print '---------->ftyjl', indexi, indexj,[bakj[nn]],
get_copy[indexi][indexj] = [bakj[nn]]
if guess_it(get_copy):
return get_copy
nn += 1
return []

L1=[[],[],[],[1],[7],[4],[2],[5],[8]]
L2=[[],[7],[8],[3],[2],[5],[6],[4],[9]]
L3=[[],[5],[4],[6],[8],[9],[7],[3],[1]]
L4=[[],[2],[1],[4],[3],[7],[5],[9],[6]]
L5=[[],[9],[6],[8],[5],[2],[3],[1],[7]]
L6=[[],[3],[5],[9],[6],[1],[8],[2],[4]]
L7=[[],[8],[9],[7],[1],[3],[4],[6],[2]]
L8=[[],[1],[7],[2],[4],[6],[9],[8],[]]
L9=[[],[4],[2],[5],[9],[8],[1],[7],[]]

Lall = [L1,L2,L3,L4,L5,L6,L7,L8,L9]

print 'Before game:'
printall(Lall)
print 'Stop here:'
oplist(Lall)
#printall(Lall)

print 'guess...'
Lall = guess_it(Lall)
if Lall:
print 'Success',id(Lall)
else:
print 'Failure'
printall(Lall) #mygod2
[Original] [Print] [Top]
Subject: Re: 函数中的一个list返回前和返回后完全不一样
Author: limodou    Posted: 2005-06-04 12:14    Length: 42 byte(s)
[Original] [Print] [Top]
我想你的参数是可变参数,可能会进行了修改。
----
[Original] [Print] [Top]
Subject: Re: 函数中的一个list返回前和返回后完全不一样
Author: gutounan    Posted: 2005-06-05 00:11    Length: 180 byte(s)
[Original] [Print] [Top]
在mygod1那一行打印之后立刻就return这个变量
返回后立刻打印返回值就和刚才不一样了
竟然有这种事情
呵呵
请问如何调试python程序阿

[Original] [Print] [Top]
Subject: Re: 函数中的一个list返回前和返回后完全不一样
Author: passworld    Posted: 2005-06-05 00:28    Length: 49 byte(s)
[Original] [Print] [Top]
The Python Debugger
import pdb
----
[Original] [Print] [Top]
Subject: Re: 函数中的一个list返回前和返回后完全不一样
Author: passworld    Posted: 2005-06-05 00:50    Length: 460 byte(s)
[Original] [Print] [Top]
guess_it
是一个递归函数,他虽然返回,但未必就是立刻反回到最外面,你没有把每一个if步骤都印出来,
所以思路混乱了。有时候递归函数在概念上未必是最清楚的。 src="http://www.linuxforum.net/forum/images/icons/wink.gif">


nval = guess_it(get_copy)
if nval:
return nval


可能是你想要的吧,不过也未必。

----
[Original] [Print] [Top]
Subject: Re: 函数中的一个list返回前和返回后完全不一样
Author: gutounan    Posted: 2005-06-05 17:30    Length: 4,461 byte(s)
[Original] [Print] [Top]
多亏有了pdb
谢谢
已经搞定
错误确实是出在了另一个return的地方
我标记了'mygod3'

#!/usr/bin/env python
import copy,sys,pdb
ALLDATA=range(1,10)

def printall(val):
for i in val:
for j in i:
print j,' ',
print ''
def getexist(val):
zz = []
for i in val:
if len(i) == 1:
zz.append(i[0])
return zz
def getvnexist(val, n):
zz = []
for i in val:
if len(i[n]) == 1:
zz.append(i[n][0])
return zz
def get_union(v1,v2):
zz=[]
for i in ALLDATA:
if i not in v1 and i not in v2:
zz.append(i)
return zz
def oplist(val):
for i in val:
n = 0
ln_exist = getexist(i)
while n < len(i):
if len(i[n]) != 1:
vn_exist = getvnexist(val, n)
i[n] = get_union(ln_exist, vn_exist)
n += 1
def has_repeat(val):
for i in val:
if val.count(i) != 1:
return True
return False
def is_bad(val):
if not val:
return True
for i in val:
if has_repeat(getexist(i)):
return True
for j in i:
if len(j) < 1:
return True
n = 0
val_len = len(val[0])
while n < val_len:
if has_repeat(getvnexist(val, n)):
return True
n += 1
return False
def all_ok(val):
if not val:
return False
for i in val:
for j in i:
if len(j) != 1:
return False
if i.count(j) != 1:
return False
n = 0
while n < len(val[0]):
zz = getvnexist(val, n)
for i in zz:
if zz.count(i) != 1:
return False
n += 1
return True
def guess_it(val):
if not val:
return []
elif is_bad(val):
return []
elif all_ok(val):
return val
for i in val:
indexi = val.index(i)
for j in i:
indexj = i.index(j)
lenj = len(j)
if lenj > 1:
get_copy = copy.deepcopy(val)
bakj = copy.copy(j)
nn = 0
while nn < lenj:
get_copy[indexi][indexj] = [bakj[nn]]
getit = guess_it(get_copy) #mygod3
if getit:
return getit
nn += 1
return []
'''
final resault shuld be this:
L1=[[9],[6],[3],[1],[7],[4],[2],[5],[8]]
L2=[[1],[7],[8],[3],[2],[5],[6],[4],[9]]
L3=[[2],[5],[4],[6],[8],[9],[7],[3],[1]]
L4=[[8],[2],[1],[4],[3],[7],[5],[9],[6]]
L5=[[4],[9],[6],[8],[5],[2],[3],[1],[7]]
L6=[[7],[3],[5],[9],[6],[1],[8],[2],[4]]
L7=[[5],[8],[9],[7],[1],[3],[4],[6],[2]]
L8=[[3],[1],[7],[2],[4],[6],[9],[8],[5]]
L9=[[6],[4],[2],[5],[9],[8],[1],[7],[3]]
'''
L1=[[],[],[3],[1],[7],[4],[2],[5],[]]
L2=[[],[],[],[3],[2],[5],[6],[4],[9]]
L3=[[],[5],[4],[6],[],[],[7],[3],[]]
L4=[[],[2],[],[4],[],[7],[5],[9],[6]]
L5=[[],[9],[6],[8],[5],[],[3],[1],[]]
L6=[[],[3],[],[9],[6],[],[8],[2],[4]]
L7=[[],[8],[9],[7],[1],[],[4],[6],[2]]
L8=[[],[1],[7],[2],[],[],[],[8],[]]
L9=[[],[4],[2],[],[9],[8],[1],[7],[]]

Lall = [L1,L2,L3,L4,L5,L6,L7,L8,L9]

print 'Before game:'
printall(Lall)
oplist(Lall)
print 'guess...'
Lall = guess_it(Lall)
if Lall:
print 'Success'
printall(Lall)
else:
print 'Failure'
[Original] [Print] [Top]
« Previous thread
在线程里调用sys.exit()不好使?
Python 编 程
9
Next thread »
拷贝对象的方法是哪个
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 04:11:11, cost 0.077056884765625 ms.