对于带有多个参数的print(),我认为它会逐一评估它们。但是,以下代码
[1, 2, 3] [1, 2, 3, 4] 4 [1, 2, 3] [1, 2, 3]
打印
a
我认为python会首先评估a[:]
,然后评估a.pop()
,然后评估a
,然后再评估a[:]
和[1, 2, 3, 4] [1, 2, 3, 4] 4 [1, 2, 3] [1, 2, 3]
,这将打印
connection_created.connect
这究竟是如何运作的?
答案 0 :(得分:5)
如果您调用函数(任何函数)。 参数首先从左到右进行评估。因此,您的代码等效于:
arg1 = a
arg2 = a[:]
arg3 = a.pop()
arg4 = a[:]
print(arg1,arg2,arg3,arg4)
(当然,Python级别不存在变量arg1
,arg2
等)
arg1
因此会引用与a
相同的列表,然后我们制作一个浅层副本a
并将其存储在{{ 1}} ,然后我们从arg2
弹出,最后一项存储在a
中,最后我们制作另一个浅拷贝 (此时为arg3
)并将其存储在a
。
这意味着:
arg4
接下来,使用这些参数调用arg1 = a # arg1 = a = [1,2,3,4]
arg2 = a[:] # arg2 = [1,2,3,4]
arg3 = a.pop() # arg1 = a = [1,2,3], arg3 = 4
arg4 = a[:] # arg4 = [1,2,3]
print(arg1,arg2,arg3,arg4)
语句,并按照我们在注释中看到的方式打印。所以它会打印出来:
print(..)
因此,重要的部分是[1, 2, 3] [1, 2, 3, 4] 4 [1, 2, 3]
不仅会返回a.pop()
和a
引用的列表的最后一个元素,还会修改该列表(删除最后一个元素) 。因此,结果arg1
和arg1
仍然引用相同的列表,但它已被修改。