| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1681 人关注过本帖
标题:类中的变量输出无结果
只看楼主 加入收藏
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
结帖率:91.43%
收藏
已结贴  问题点数:20 回复次数:3 
类中的变量输出无结果
代码如下,是N皇后问题的解法。
但是在调用printall()函数的时候,类中的变量是空,在初始化时候又能够输出结果。不理解为什么。
程序代码:
class Nqueen(object):
    
    n = -1
    queenlists = [] #空列表 存储总的序列
    queenlist = [] #空列表 存储单个满足条件的序列
    
    def __init__(self, N):#构造函数,初始化执行
        self.n = N
        self.solution(N)

    def solution(self, N): 
        if N == 0:
            print(self.queenlist)
            self.queenlists.append(self.queenlist)
            return 
        for tmp in range(0, self.n):
            if self.check(N, tmp)== True:
                self.queenlist.append(tmp)
                self.solution(N-1)
                self.queenlist.pop(-1)# 出队列,0是第一个,-1是最后一个,默认-1,类似数组下标
                   
    def check(self, N, tail):
        if N == 0:
            print('N:0 %s' %(self.queenlist))
            return True
        for tmp in self.queenlist:#行重复
            if tmp == tail:                              
                return False
        for tmp in range(0, len(self.queenlist)):
            if abs(tmp-len(self.queenlist)) == abs(self.queenlist[tmp]-tail):
                return False
        return True
    
    def printall(self):
        for tmp in self.queenlists:
            print(tmp)
        print(self.queenlists)


Nqueen(8).printall()
#queens = Nqueen(4)
#queens.solution(queens.n)
#queens.printall()


搜索更多相关主题的帖子: if return tmp 类中 solution 
2020-10-14 01:12
fall_bernana
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:17
帖 子:243
专家分:2106
注 册:2019-8-16
收藏
得分:10 
回复 楼主 lyl930130
程序代码:
def solution(self, N): 
        if N == 0:
            print(self.queenlist)
            self.queenlists.append(self.queenlist)
            return 
        for tmp in range(0, self.n):
            if self.check(N, tmp)== True:
                self.queenlist.append(tmp)
                self.solution(N-1)
                self.queenlist.pop(-1)

虽然不太懂你这个逻辑,但是self.queenlists你插入的是self.queenlist是个可变变量。在for循环里append一个又pop一个。必然导致self.queenlist最后是空的。影响到self.queenlists里的self.queenlist。如果想保留。需要使用
import copy
self.queenlists.append(copy.deepcopy(self.queenlist))这个来保留数据。
2020-10-14 09:52
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 2楼 fall_bernana
谢谢。
那append就是类似赋给指针的值,copy.deepcopy就是把内容挨个复制进去,是这个意思吗?
2020-10-14 11:14
fall_bernana
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:17
帖 子:243
专家分:2106
注 册:2019-8-16
收藏
得分:10 
以下是引用lyl930130在2020-10-14 11:14:21的发言:

谢谢。
那append就是类似赋给指针的值,copy.deepcopy就是把内容挨个复制进去,是这个意思吗?



self.queenlists.append(self.queenlist) 是把queenlist的指针赋给queenlists
self.queenlists.append(copy.deepcopy(self.queenlist)) 是重新生成一份新的内存数据。把新的内存地址赋给queenlists
2020-10-14 11:48
快速回复:类中的变量输出无结果
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017750 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved