Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为类属性生成随机数_Python_Python 3.x_Numpy_Random - Fatal编程技术网

Python 为类属性生成随机数

Python 为类属性生成随机数,python,python-3.x,numpy,random,Python,Python 3.x,Numpy,Random,我有以下代码: from numpy import random class Person(): def __init__(self, name, age=random.randint(18,65)): self.name = name self.age = age 我希望年龄是18到65之间的随机数,除非明确指定。但是,当我创建此类的不同实例时,如下所示: p1 = Person('Bob') p2 = Person('Sue') p3 = Per

我有以下代码:

from numpy import random

class Person():

    def __init__(self, name, age=random.randint(18,65)):
        self.name = name
        self.age = age
我希望年龄是18到65之间的随机数,除非明确指定。但是,当我创建此类的不同实例时,如下所示:

p1 = Person('Bob')
p2 = Person('Sue')
p3 = Person('Jeff')

每个人都有相同的年龄。如何解决此问题?

之所以
age
总是相同的,是因为
age
参数的值是在定义方法
\uuuu init\uuuu
时定义的,并且不会在每次调用方法时重新创建,如果希望每次调用方法时都更改变量
age
的实例化,请将其移动到方法内部

from numpy import random

class Person():
    def __init__(self, name, age=None):
        self.name = name
        self.age = age if age else random.randint(18, 65)

p1 = Person('Bob')
p2 = Person('Sue', 20)
p3 = Person('Jeff')

print(p1.age)
>> 56
print(p2.age)
>> 20
print(p3.age)
>> 20

print(Person('Sue', 20).age)
>> 20

这种行为的原因是属性的默认值只被初始化并设置了一次,因此代码片段
random.randint(18,65)
将被执行并设置为年龄的默认值,这就是如果不提供年龄,则年龄的默认值相同的原因

要解决问题请将默认值设置为“无”,并在需要时执行随机值的检查和分配:

from numpy import random


class Person():

    def __init__(self, name, age=None):
        if age is None:
            age = random.randint(18,65)
        self.name = name
        self.age = age
有关默认属性的有用信息:


人('Sue',0'的年龄值是多少?@AndriyIvaneyko它是20,你的答案是这个答案的精确副本,怎么是0?是的,它非常相似,但不相同,
if age
vs
if age is None
是完全不同的,解释推理也与我的观点不同(如果您对原因感兴趣,这就是给出另一个答案的原因)。我对差异感兴趣?一个测试值是否为非类型,另一个检查值是否不=0?正确吗?不,一个检查非类型,另一个检查值是否为falsy(更多信息:)