好吧,这可能是一个愚蠢的想法,但是我现在还停留在那儿。 我正在处理元组类型的参数,其中包含列表列表,只是无法正确读取它们。
这是一个基本示例:
def test(*args):
for arg in args:
print(arg)
print(arg[0])
print(arg[1])
testTuple1 = ([["x_1", "x_2", "x_3"], []])
testTuple2 = ([['x_1', 'x_2', 'x_3'], []], [['x_2', 'x_3'], ['x_1']])
test(testTuple1)
test(testTuple2)
这将产生以下输出:
[['x_1', 'x_2', 'x_3'], []]
['x_1', 'x_2', 'x_3']
[]
([['x_1', 'x_2', 'x_3'], []], [['x_2', 'x_3'], ['x_1']])
[['x_1', 'x_2', 'x_3'], []]
[['x_2', 'x_3'], ['x_1']]
第一个示例的输出是我期望的输出。但是我没有得到第二个示例的第一个输出。为什么我得到一个元组而不是元组中包含的第一个列表:[['x_1','x_2','x_3'],[]]?
答案 0 :(得分:2)
因为在python中,parens用于创建文字元组和常规表达式分组,因此产生了一些歧义。这是您的列表,为清晰起见添加了一些格式:
testTuple1 = (
[
["x_1", "x_2", "x_3"],
[]
]
)
testTuple2 = (
[
['x_1', 'x_2', 'x_3'],
[]
],
[
['x_2', 'x_3'],
['x_1']
]
)
testTuple1
由于外部括号仅包含一个项目(最外部的列表),因此将求值为该外部列表。 parens消失了。但是在testTuple2
中,由于存在多个逗号分隔的列表,因此它将评估为元组。
如果您还希望第一个也是元组,则需要在外部列表后添加尾随逗号,以明确地让python知道这些括号是用来表示1元组的,而不仅仅是分组:
testTuple1 = ([["x_1", "x_2", "x_3"], []],)
答案 1 :(得分:0)
当您使用星号作为参数的修饰符时,它将使您在调用函数时可以传递任意多个参数。
def test(*args):
# Do anything
test(v1)
test(v1, arg, another, something)
test()
它将最终将调用中的所有参数连接到一个元组中。
当您仅将一个参数传递给函数调用时,无论该对象实际上具有什么类,元组参数都将仅由该一个参数组成。只需在迭代之前进行打印即可。然后,您将看到args
的实际值,它解析为:
([['x_1', 'x_2', 'x_3'], []],)
如果您想将迭代器传递给函数并将第一层的元素扩展到参数,只需在调用时再次使用星号即可。
>> test(*testTuple1)
['x_1', 'x_2', 'x_3']
'x_1'
'x_2'
[]
IndexError: ....
发生IndexError的原因是,空列表没有第0个或第一个要获取的元素。