Собственно, это именно то, чего вы ожидаете. Давайте разложим, что здесь происходит:
Вы пишете
lst = [[1] * 4] * 3
Это эквивалентно:
lst1 = [1]*4
lst = [lst1]*3
Это означает, что lst
- это список с 3 элемента, указывающие на lst1
. Это означает, что две следующие строки эквивалентны:
lst[0][0] = 5
lst1[0] = 5
Поскольку lst[0]
- это только lst1
.
Чтобы получить желаемое поведение, вы можете использовать понимание списка:
lst = [ [1]*4 for n in xrange(3) ]
В этом случае выражение переоценивается для каждого n, что приводит к другому списку.
Ты был на правильном пути. Комментарий @HansPassant указал мне на мгновение «эйрек», когда он предположил, что он взорвался по другому параметру. Первый и второй параметры имеют другой тип. Передано в обратном порядке для :: Invoke, они фактически являются вторым и третьим параметрами. Таким образом, это действительно взорвало мой параметр «1-го» с несоответствием типа.
В моей первоначальной версии концептуальной концепции я вручную передавал параметры, и я целенаправленно передавал параметры в обратном порядке, так как требуется IDispatch :: Invoke. В процессе преобразования этого в более общий подход, зацикливающийся на массив параметров, переданных от вызывающего, я менял порядок параметров ПОСЛЕ вызова вызова IDispatch :: Invoke, когда я возвращаю их в вызывающее приложение, однако, я забыл обратить вспять они по дороге до вызова Invoke.
Священные «вы-знаете-что» ошибки настолько эзотеричны для кого-то, у кого нет опыта работы с этим материалом!
Как только я исправил порядок параметров, все пошло точно так, как ожидалось. «Вариация 1» из моего вопроса была, конечно, правильным способом обработки параметра BSTR *. Для ясности здесь приведен правильный способ инициализации параметра варианта для параметра BSTR *, вызываемого IDispatch :: Invoke (в моем случае есть еще два параметра, которые здесь не показаны)
VARIANTARG* v = new VARIANTARG[3];
//...Init my first 2 args IN REVERSE (not shown here)
//Init my third arg which is the BSTR* parameter
VariantInit(v[0]);
BSTR val = SysAllocString(L"");
v[0].vt = VT_BSTR | BT_BYREF;
v[0].pbstrVal = &val;
v[0].vt = VT_BSTR | BT_BYREF
должна читатьVT_BSTR | VT_BYREF
(VT_, а не BT_) – transistor1 31 January 2017 в 15:08