使用随机init变量(python)创建类实例的副本

时间:2015-03-18 22:55:28

标签: python random

我需要使用随机生成的数字初始化类的实例。然后我需要在几个不同的试验中使用这个实例。但是,我在制作此实例的精确副本时遇到了麻烦 - 随机生成的数字不会保持不变。每个副本都会生成一个新的随机数。

temp = proc(random.randint(min, max))
tempCpy = copy.copy(temp) #changes on temp interfere with tempCpy
tempCpy = copy.deepcopy(temp)  #doesn't start with same random number

3 个答案:

答案 0 :(得分:2)

你有一个这样的课,我假设:

class proc(object):

    def __init__(self, value):
        self.value = value

初始化第一个实例时,请写下:

temp = proc(random.randint(min, max))

这会将随机数存储在temp.value

要制作副本,您只需将temp.value传递给proc构造函数:

dupe = proc(temp.value)

您也可以编写自己的类来自动执行此操作,以便在将proc的实例传递给proc构造函数时,它会复制(与其他类型一样,例如{{ 1}}和list,其构造函数可用于复制它们。这样做的好处是可以保留所有需要做的知识,以便在类中创建副本而不是调用者需要知道数据的存储位置。

dict

现在,你可以写:

class proc(object):
    def __init__(self, value):
        if isinstance(value, proc):
            value = value.value
        self.value = value

或者,您可以向dupe = proc(temp) 添加方法以制作副本:

proc

现在你的副本是:

class proc(object):

    def __init__(self, value):
        self.value = value

    def copy(self):
        return type(self)(self.value)

最后,如果您为dupe = temp.copy() 方法copy命名(或同时使用这两个名称),它会神奇地与__copy__一起使用!

copy.copy

答案 1 :(得分:0)

您需要使用您将重用的参数初始化random.seed()。它将保证您生成“相同的随机数”。 (例如,在代码的其余部分之前的random.seed(0))

答案 2 :(得分:0)

也许,你可以单独从你的对象中随机编号?

init_numb = random.randint(min, max)
temp = proc(init_numb)
tempCpy = copy.copy(temp) #changes on temp interfere with tempCpy
tempCpy = copy.deepcopy(temp)