首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的类对象正在删除它的部分内容

我的类对象正在删除它的部分内容
EN

Stack Overflow用户
提问于 2022-05-10 22:45:46
回答 1查看 34关注 0票数 0

我为这个非描述性的标题道歉,我不知道如何去描述这个问题.

以下是我的当前代码:

代码语言:javascript
复制
from __future__ import annotations
import random

class Hat():
    def __init__(self, **kw):
        self.contents = []
        keys = list(kw.keys())
        values = list(kw.values())
        j = 0
        while j < len(values):
            h = 0
            while h < values[j]:
                self.contents.append(keys[j])
                h += 1
            j += 1
        
    def draw(self, num_balls = 0):
        j = 0
        picked_balls = []
        not_picked_balls = self.contents
        while j < num_balls:
            if len(not_picked_balls) == 0:
                break
            pick = random.randint(0, (len(not_picked_balls) - 1))
            picked_balls.append(not_picked_balls[pick])
            not_picked_balls.pop(pick)
            j += 1
        return(picked_balls)

很乱我知道..。我来解释一下。类必须以以下形式初始化:

代码语言:javascript
复制
hat1 = Hat(yellow=10, red=8)

我认为最好的方法是使用**kw编写字典,从而实现初始化。然后,我将其转化为一个名为self.contents的列表。

然而,这不是问题所在,也就是抽签函数。我之所以这样做,是因为它不会更改self.contents列表,但不知怎么的,它正在更改它。(hat.draw只返回从“Hat”中随机选择的彩色“球”列表)这就是我要做的:

代码语言:javascript
复制
print(hat1.draw(8))
print(hat1.draw(8))
print(hat1.draw(8))
print(hat1.draw(8))
print(hat1.draw(8))

这是输出:

代码语言:javascript
复制
['yellow', 'yellow', 'red', 'yellow', 'red', 'red', 'yellow', 'yellow']
['red', 'red', 'yellow', 'yellow', 'yellow', 'yellow', 'red', 'yellow']
['red', 'red']
[]
[]

你可以从输出中看到,不知怎么的,我似乎失去了内容。当我在函数中放置打印(self.contents)以查找错误时,这是正确的,这就是我得到的结果:

代码语言:javascript
复制
['yellow', 'yellow', 'yellow', 'yellow', 'yellow', 'yellow', 'yellow', 'yellow', 'yellow', 'yellow', 'red', 'red', 'red', 'red', 'red', 'red', 'red', 'red']
['yellow', 'yellow', 'yellow', 'yellow', 'yellow', 'yellow', 'yellow', 'red', 'red', 'red']
['yellow', 'yellow']
[]
[]

我似乎不明白为什么这种情况会改变。任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

发布于 2022-05-10 22:47:59

这是错误的原因:

代码语言:javascript
复制
not_picked_balls = self.contents

在python中,这意味着not_picked_ballsself.contents都引用相同的内存位置。

相反,您需要创建self.contents的副本并将其分配给not_picked_balls

代码语言:javascript
复制
not_picked_balls = self.contents.copy()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72193676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档