标题:类中的变量输出无结果
只看楼主
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
帖 子:240
专家分:2086
注 册: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
帖 子:240
专家分:2086
注 册: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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-503468-1-1.html




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

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