无枝为檄 发表于 2021-3-8 22:22:17

为什么要那个for循环呢?

class Stack:
    def __init__(self, start=[]):
      self.stack = []
      for x in start:
            self.push(x)

    def isEmpty(self):
      return not self.stack
   
    def push(self, obj):
      self.stack.append(obj)

    def pop(self):
      if not self.stack:
            print('警告:栈为空!')
      else:
            return self.stack.pop()

    def top(self):
      if not self.stack:
            print('警告:栈为空!')
      else:
            return self.stack[-1]

    def bottom(self):
      if not self.stack:
            print('警告:栈为空!')
      else:
            return self.stack


为什么需要那个 for 循环啊

jackz007 发表于 2021-3-8 22:45:12

本帖最后由 jackz007 于 2021-3-8 22:55 编辑

      这个循环的作用是在定义对象时,可以将指定的数据初始化进栈
      例如,可以这样初始化和使用对象:
#coding:gbk

class Stack:
    def __init__(self, start=[]):
      self.stack = []
      for x in start:
            self.push(x)

    def __repr__(self):                # 添加此方法,方便显示对象属性状态
      return repr(self . stack)

    def __str__(self):               # 添加此方法,方便查询对象属性状态
      return str(self . stack)

    def isEmpty(self):
      return not self.stack
   
    def push(self, obj):
      self.stack.append(obj)

    def pop(self):
      if not self.stack:
            print('警告:栈为空!')
      else:
            return self.stack.pop()

    def top(self):
      if not self.stack:
            print('警告:栈为空!')
      else:
            return self.stack[-1]

    def bottom(self):
      if not self.stack:
            print('警告:栈为空!')
      else:
            return self.stack

s = Stack(('A' , 5 , 'ABC', 6 , 'ABCDE' , 7))
print(s)                           # 显示对象属性状态
for _ in range(len(s . stack)) :
    print(s . pop())

逃兵 发表于 2021-3-9 08:04:29

因为你第一个代码 默认参数的值设置为一个列表,因为列表是可变的,会导致你列表中元素可能发生改变

举个例子,下面这个代码执行同个函数就会导致原本是默认的参数变成变化的参数:

def test(list1=[], number=100):
    list1.append(number)
    print(list1)
   
test()
test()
test()



输出结果,每次调用同个函数,默认参数的结果都不同:




转载自鱼C论坛
https://fishc.com.cn/forum.php?mod=viewthread&tid=189604&highlight=init

oNlYLeeee 发表于 2021-3-9 11:39:51

    在构造函数__init__里面,构造一个栈,不能说拿过来一个列表就说是栈。

    栈是如何生成的?first in last out, 即通过入栈的方式one by one加到空栈里面去。

    通过构造函数,一个个元素入栈,完成格式化和初始化,{:10_256:},ok,栈就生成了,然后就可以名正言顺地用上class stack里面的方法、属性了。

无枝为檄 发表于 2021-3-12 09:03:23

jackz007 发表于 2021-3-8 22:45
这个循环的作用是在定义对象时,可以将指定的数据初始化进栈
      例如,可以这样初始化和使用对象 ...

我懂了 谢谢{:10_254:}

无枝为檄 发表于 2021-3-12 09:04:37

逃兵 发表于 2021-3-9 08:04
因为你第一个代码 默认参数的值设置为一个列表,因为列表是可变的,会导致你列表中元素可能发生改变

举 ...

ok 谢谢{:10_254:}

无枝为檄 发表于 2021-3-12 09:05:09

oNlYLeeee 发表于 2021-3-9 11:39
在构造函数__init__里面,构造一个栈,不能说拿过来一个列表就说是栈。

    栈是如何生成的?first...

好的 谢谢{:10_256:}
页: [1]
查看完整版本: 为什么要那个for循环呢?