为什么解包会在元组中产生结果

时间:2016-10-27 15:24:59

标签: python python-2.7 python-3.x

我正在学习任意值参数并阅读stackoverflow thisthis答案和其他教程我已经理解了* args和** kwargs在python中做了什么,但我遇到了一些错误。我有两个疑问,第一个是:

如果我运行此代码打印(w),那么我得到此输出:

def hi(*w):
    print(w)

kl = 1, 2, 3, 4
hi(kl)

输出:

((1, 2, 3, 4),)

但如果我使用print(*w)运行此代码,那么我将获得此输出:

代码:

def hi(*w):
    print(*w)

kl = 1, 2, 3, 4
hi(kl)

输出:

(1, 2, 3, 4)

我的第二个疑问是:

je = {"a": 2, "b": 4, "c": 6, 4: 5}
for j in je:
    print(*je)

输出

b a 4 c
b a 4 c
b a 4 c
b a 4 c

*je究竟在做什么?它是如何在迭代中工作的?

2 个答案:

答案 0 :(得分:4)

当你在参数def hi(*w):的声明中使用*时,它意味着所有参数都将被压缩为元组,例如:

hi(kl, kl) # ((1, 2, 3, 4), (1, 2, 3, 4))

当您使用print(* w)*运行解压缩元组时。

je={"a":2,"b":4,"c":6,4:5}
for j in je:
    print(*je)

在每次迭代中你都使用你的dict解压缩(你使用je并得到你的dict的键,如[j for j in je])

https://docs.python.org/2/tutorial/controlflow.html#tut-unpacking-arguments

答案 1 :(得分:2)

您的第一个案例,因为您将kl作为元组传递给函数,而不是任意值。因此,*w将扩展为单个元素元组,其中kl为第一个值。

你实际上是在打电话:

hi((1, 2, 3, 4))

然而,我怀疑你想要的是

hi(1, 2, 3, 4)
# or in your case
hi(*kl)

在python 3中打印时,print是一个函数,所以再次。当w是元组时,您将其称为:

print(w)
# you'll get the tuple printed:
# (1, 2, 3, 4)

但是,您可以再次使用以下参数调用它:

print(1, 2, 3, 4)
# or in your case
print(*w)
# 1 2 3 4

对于您的第二部分,请先查看它转换为列表:

list({"a":2,"b":4,"c":6,4:5})
# ["b", "a", 4, "c"]
# Note, dictionaries are unordered and so the list could be in any order.

如果您要使用*扩展程序将其传递给打印:

print("b", "a", 4, c)
# or in your case
print(*["b", "a", 4, "c"])

请注意,*为您执行默认迭代。如果您想要其他一些值,请使用je.values()je.items()