我想了解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.
为什么不会发生?下一个()或者它们以什么方式不同?