打印函数调用和迭代器的评估

时间:2017-03-26 20:52:34

标签: python reference iterator

我想了解Python在打印语句中评估函数调用的方式,或者更具体地说,是什么调用 next(some_iter)回归?在上次评估some_iter时,对下一个位置中的元素的可变引用,或者只是下一个位置中元素的副本?

以下代码:

def foo(val, arr=set()):
    arr.add(val)
    return arr

print(foo(1))
print(foo(2))
print(foo(1), foo(3), foo(0))

返回输出:

{1}
{1, 2}
{0, 1, 2, 3} {0, 1, 2, 3} {0, 1, 2, 3}

Python调用该函数三次,持有似乎是对arr的引用,然后,因为集合是可变的,所以输出如上所示。未按照print语句的顺序调用foo(1)返回值,即{1, 2}

然而

lst = [1, 2, 3, 4]
def bar(a):
    a = lst
    a[0] = 17
    return a
x = iter(lst)
y = iter(lst)
print(next(x), bar(lst), next(y), next(x))
print(lst)

会打印

1 [17, 2, 3, 4] 17 3
[17, 2, 3, 4]

我原本预计

17 [17, 2, 3, 4] 17 3
[17, 2, 3, 4] 

这是为了接下来保持对lst的第一个元素的引用,稍后将更改为17,并且该引用最终将打印为17,但它首先计算返回1.

为什么不会发生?下一个()或者它们以什么方式不同?

0 个答案:

没有答案