Я недавно пришел со следующим кодом:
info = ([
["id", "name", "price", "quantity"],
[24351, "pen", 2.41, 500],
[None, "pencil", 0.99, 25],
[63401, "grizzly bear", None, 1],
[3532, "rubber duck", 5.45, 24],
[1523, None, 3.00, 6.8],
[11765, "caviar", 67.95, None]
], True, False)
Эта "информация" была передана функции:
do_something(info)
Функция была определена следующим образом:
do_something(data, header = False, index = False):
do something with data
Когда я выполнил код, я получил ошибку: TypeError: объект 'bool' не повторяется. Это было потому, что где-то в коде я попытался l oop над двумерным массивом так:
for row in data:
for element in row:
do something
Однако я обнаружил, что «данные» содержат весь кортеж, а не только 2d - массив, вызывающий эту ошибку при достижении «True». Я смог решить проблему, вызвав функцию следующим образом:
do_something(*info)
Таким образом, кортеж распаковывается правильно. Однако я ищу другое решение, так как я не могу решить, как вызывается функция, поэтому она должна оставаться такой:
do_something(info)
В настоящее время я также пытаюсь понять, ПОЧЕМУ данные кажутся «перекрытие». Значение позиционных аргументов 1 и 2 (заголовок и индекс) будет правильно адресовать позиции 1 и 2 кортежа, который передается функции. Заголовок Истинный, Индекс Ложный (за исключением того, что это по умолчанию). Однако 0-й позиционный аргумент «data» содержит не только 0-й элемент кортежа, 2d-массив, но и все данные внутри информационного кортежа.
Здесь я рассмотрел некоторые темы переполнение стека и нашел решение, используя *, а также некоторые объяснения, как кортежи работают в вызовах функций, а также позиционные аргументы в целом, но я не смог понять, почему весь информационный кортеж оказался бы внутри 0-го позиционного аргумента «data» в то время как «заголовок» и «индекс» будут работать ожидаемым образом, просто вытягивая части кортежа, соответствующие их положению.