注册 登录
编程论坛 Python论坛

类中的变量输出无结果

lyl930130 发布于 2020-10-14 01:12, 1868 次点击
代码如下,是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()


3 回复
#2
fall_bernana2020-10-14 09:52
回复 楼主 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))这个来保留数据。
#3
lyl9301302020-10-14 11:14
回复 2楼 fall_bernana
谢谢。
那append就是类似赋给指针的值,copy.deepcopy就是把内容挨个复制进去,是这个意思吗?
#4
fall_bernana2020-10-14 11:48
以下是引用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
1