【问题标题】:Why does my variable return None, Even though being defined为什么我的变量返回无,即使被定义
【发布时间】:2020-04-06 07:46:33
【问题描述】:

我目前正在做一个需要我制作游戏的python项目;我已经定义了一个名为Game 的类,它在初始化时采用P1P2Player 类实例)。

然后我定义了一个名为deck 的列表,然后我将其重新洗牌并重新定义为新洗牌的牌组。问题是当我打印deck 时,它会打印None

import random
class Game():
    deck = []
    def __init__(self, p1, p2):
        self.p1 = p1
        self.p2 = p2
        self.__generateCards()
    def __generateCards(self):
        colors = ['red', 'black', 'yellow']
        for x in range(0,3):
            for y in range(1,11):
                li = [colors[x], y]
                self.deck.append(li)
        self.deck = random.shuffle(self.deck)
        print(self.deck)

【问题讨论】:

  • 不相关,但您不想将deck 设为类属性(类属性在类的所有实例之间共享)。从类块中删除deck = [] 并在__init__ 之前 调用self._generatedCards() 中添加self.deck = []
  • 另外,不要对实现属性或方法使用双前导下划线 - 约定是一个前导下划线。双下划线(触发名称修改机制)只是为了防止意外的名称冲突,实际上在实践中几乎没有用处,即使在巨大的框架中也是如此。

标签: python class random


【解决方案1】:

random.shuffle 返回 None,它在原地随机播放,因此 self.deck 为 None。

【讨论】:

    【解决方案2】:

    random.shuffle() 不返回任何内容。

    建议使用 random.sample() 代替 docs

    ...
       self.deck = random.sample(self.deck, k=len(self.deck))
    ...
    

    【讨论】:

      【解决方案3】:

      看看这个资源:https://www.w3schools.com/python/ref_random_shuffle.asp

      Python 的 random.shuffle(list) 会随机播放,因此无需将变量设置为结果。

      【讨论】:

        【解决方案4】:

        在其他 cmets 中已经说过,random.shuffle(list) 就地洗牌。 所以你可以做的是:

        import random
        class Game():
            deck = []
            def __init__(self, p1, p2):
                self.p1 = p1
                self.p2 = p2
                self.__generateCards()
            def __generateCards(self):
                colors = ['red', 'black', 'yellow']
                for x in range(0,3):
                    for y in range(1,11):
                        li = [colors[x], y]
                        self.deck.append(li)
                random.shuffle(self.deck)    #here, don't do self.deck = random.shuffle(self.deck)
                print(self.deck)
        

        【讨论】:

          【解决方案5】:

          ''' 随机导入

          deck = list(itertools.product(range(1, 14), ['red', 'black', 'yellow']))

          random.shuffle(deck)

          print("玩家一拿到")

          对于范围 (5) 中的 p1: 打印(甲板[p1][0],“的”,甲板[p1][1])

          print("\n 玩家拖了") 对于范围(5)中的 p2: 打印(甲板[p2][0],“的”,甲板[p2][1])

          问题是在追加行之后。 '''

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-06-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-06-14
            • 1970-01-01
            • 1970-01-01
            • 2021-04-25
            相关资源
            最近更新 更多