我正在阅读“Python's Bite”一书,正在阅读“功能”主题,我无法理解示例中的代码是如何工作的。我尝试一步一步地在解释器中查看这段代码的执行——这并没有增加清晰度。
在我看来,它应该是这样的。我显然误解了一些东西,请纠正我。当函数被调用时,参数extra_numbers被赋值为 50,*numbers值被放置在 中(10, 1, 2, 3),参数initial = 5没有以任何方式改变,然后函数体被执行,在我看来如下:
- 变量
count被赋予参数的值initial,即5。 - 循环
for中的下一个是变量值参数的枚举,*numbers循环体,在循环的每次迭代中存储在变量中number。 - 在循环的第一次迭代中,
for参数的第一个参数被获取*numbers,也就是说10,并添加到变量的值中count。它是15通过将变量count本身的值更改为15. - 在循环的第二次迭代中,取
for参数的第二个参数*numbers,也就是1和变量的值相加count,也就是有了值15,变量接收到一个新的值16,里面存储了 - 在循环的第三次迭代中,与 1. 和 2. 示例中发生的情况类似,即变量在循环的下一次迭代
count之前和之后发生了变化1821 - 然后循环
for停止工作,执行下一个函数表达式total,即count += extra_numbers根据结果为变量count赋值71,因为它在循环结束时的值为 18,而参数的extra_numbers值为50。现在的问题是,66 是从哪里来的,我哪里出错了?
def total(initial = 5, *numbers, extra_numbers):
count = initial
for number in numbers:
count += number
count += extra_numbers
print(count)
total(10, 1, 2, 3, extra_numbers = 50)
#Вывод в консоль: 66
你误会了一点。参数
initial被分配了值10,因为它首先出现。= 5是默认设置。如果我们这样写:就像你说的那样。而现在
initial = 10,numbers = (1, 2, 3)extra_numbers = 50让我们添加函数参数的打印:
结论:
传递的未命名参数按顺序分配。因此, 10 进入
initial,除extra_numbers进入之外的所有内容numbers,并由名称具体指定extra_numbers进入相应的变量。