Python函数默认参数随机值

3
在下面的代码中,会生成一个随机值,如预期所示:
import random

for i in range(10):
    print(random.randint(0,10))

然而,如果我使用一个函数,这就不起作用了:

import random

def f(val: int = random.randint(0,10)):
    print(val)

for i in range(10):
    f()

第二段代码片段的结果为什么总是相同的数字?我能找到的最相似的问题是this,但它涉及到一种不同的语言(我不掌握)。

1
这是因为参数只会被评估一次。你可以搜索“Python 默认参数”了解更多信息。 - undefined
2
这个回答解决了你的问题吗?“最少惊讶”和可变默认参数 - undefined
@MisterMiyagi,这确实引导我阅读了这篇文章:http://effbot.org/zone/default-values.htm,它解答了我的问题。但是当我回到帖子时,已经有人给出了答案。感谢您提供的建议阅读链接。 - undefined
3个回答

6

默认参数表达式在你调用函数时不会被评估,而是在你创建函数时被评估。因此,无论你做什么,你总是会得到相同的值。

解决这个问题的典型方式是使用一个标志值,并在函数体内替换它:

def f(val=None):
    if val is None:
        val = random.randint(0,10)
    print(val)

选择这个答案是因为它说明了val的评估时间和方式。我理解它就像C语言中的一个静态局部变量。 - undefined
@mushishi 我总是试图强调这一点,因为我熟悉C++,它的默认参数是在调用时计算的。称之为“静态”并不完全准确,而是函数f变成了一个对象,参数列表和默认值成为该对象的属性。 - undefined

1
您希望将默认值设置为特定值。为了使其具有动态性,您需要将其默认值设置为其他值,检查该值,然后更改该值。
例如:
import random

def f(val=None):
    if val is None:
        val = random.randint(0,10)
    print(val)

for i in range(10):
    f()

0

调用时无法更改默认参数。 我不明白为什么需要它。 你可以简单地这样做。

import random
def f():
  print(random.randint(0,10))
for i in range(10):
  f()

这只是对真实世界代码的过度简化。我可以检查默认参数是否设置,如果没有设置,则返回;但我很好奇为什么我不能节省这额外的几行代码。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接