我为这个非描述性的标题道歉,我不知道如何去描述这个问题.
以下是我的当前代码:
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)很乱我知道..。我来解释一下。类必须以以下形式初始化:
hat1 = Hat(yellow=10, red=8)我认为最好的方法是使用**kw编写字典,从而实现初始化。然后,我将其转化为一个名为self.contents的列表。
然而,这不是问题所在,也就是抽签函数。我之所以这样做,是因为它不会更改self.contents列表,但不知怎么的,它正在更改它。(hat.draw只返回从“Hat”中随机选择的彩色“球”列表)这就是我要做的:
print(hat1.draw(8))
print(hat1.draw(8))
print(hat1.draw(8))
print(hat1.draw(8))
print(hat1.draw(8))这是输出:
['yellow', 'yellow', 'red', 'yellow', 'red', 'red', 'yellow', 'yellow']
['red', 'red', 'yellow', 'yellow', 'yellow', 'yellow', 'red', 'yellow']
['red', 'red']
[]
[]你可以从输出中看到,不知怎么的,我似乎失去了内容。当我在函数中放置打印(self.contents)以查找错误时,这是正确的,这就是我得到的结果:
['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']
[]
[]我似乎不明白为什么这种情况会改变。任何帮助都是非常感谢的!
发布于 2022-05-10 22:47:59
这是错误的原因:
not_picked_balls = self.contents在python中,这意味着not_picked_balls和self.contents都引用相同的内存位置。
相反,您需要创建self.contents的副本并将其分配给not_picked_balls。
not_picked_balls = self.contents.copy()https://stackoverflow.com/questions/72193676
复制相似问题