Списки - это изменяемые объекты, поэтому даже если вы создаете новый объект списка, выполнив matrix[:]
, ваши подсписки все еще указывают на то же самое объекты ...
Вот первый обходной путь:
matrix = [[1, 2], [3, 4]]
new_copies = []
counter = 0
for i in range(0, 2):
sublist = matrix[i][:]
for k in range(0, 2):
if matrix[i][k] > 3:
sublist[k] += 10
counter += 1
new_copies.append(sublist)
print(matrix)
print(new_copies)
Если возможно, вы также можете использовать понимание списков [ 115], в этом случае это будет:
new_copies = [[(e + 10 if e > 3 else e) for e in l] for l in matrix]
, который даст вам тот же результат, что и мое предыдущее предложение
Хорошее решение будет использовать кортежи вместо списков, потому что они являются неизменяемыми объектами. Но это не будет возможно, если вам придется изменять свою матрицу в соответствии с вашей программой.
Вы также можете использовать метод глубокой копии из библиотеки копий ...
Я должен напомнить, что по возможности следует избегать использования eval
...
Проблема:
Задача MSBuild (не MSBuild.exe, задача MSBuild с именем MSBuild) не может обрабатывать несколько констант, используемых проектами WIX. Обычно вы указываете свойства в своем сценарии сборки, например:
<MSBuild Projects="YourSolution.sln" Properties="Configuration=MyConfig;Platform=x86;DefineConstants="SOMETHING=1;SOMETHINGELSE=2"" />
Однако при просмотре журналов сборки вы видите, что MSBuild разделяет константы и не сохраняет значения, сгруппированные вместе, как вы ожидаете - аналогично:
Task "MSBuild" Global Properties:
Configuration=MyConfig
Platform=x86
DefineConstants="SOMETHING=1
SOMETHINGELSE=2"
Поэтому, когда свеча пытается использовать эти константы, она обычно отвечает сообщением «ошибка CNDL0150: Неопределенная переменная препроцессора '$ (var.SOMETHINGELSE)'. Это означает, что задача MSBuild неправильно обрабатывает свойства, которые содержат несколько знаков '=' в значении. даже если они сгруппированы в кавычках. Без сгруппированных значений свойств в кавычках их, очевидно, следует рассматривать как отдельные свойства, а не как одно значение.
Временное решение:
Чтобы решить эту проблему, вам необходимо чтобы вызвать MSBuild.exe напрямую и передать эти значения ему вручную.
msbuild.exe /p:Configuration=MyConfig /p:Platform=x86 /p:DefineConstants="SOMETHING=1;SOMETHINGELSE=2" YourSolution.sln
Это позволит вашим константам работать так, как вы хотите, без необходимости переделывать проект установки WiX.
ПРИМЕЧАНИЕ: Если вы только используя единственную константу nt вы все еще можете использовать задачу MSBuild следующим образом:
<MSBuild Projects="YourSolution.sln" Properties="Configuration=MyConfig;Platform=x86;DefineConstants="SOMETHING=1"" />
Я думаю, что что-то вроде этого должно работать.
<DefineConstants>DEBUG;TRACE</DefineConstants>
Проверка это сообщение в блоге, чтобы видеть, может ли это выручить Вас. http://www.sedodream.com/PermaLink,guid,9b1d23aa-6cb2-48cb-a47a-9cef29622676.aspx
Также проверка это сообщение форума. Это решает подобную проблему как Ваш. http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/3f485bf4-1b00-48bf-b5d0-4b83341ce4a6/
Почему вы указываете DefineContstants = ProductVersion = XXXXXX?
Для DefineConstants значения не присваиваются, либо константа (например, DEBUG или TRACE) определена, либо нет. Это свойство относится к переключателю компилятора C # / define . Что вы на самом деле пытаетесь сделать?
Также я не уверен, что вы имеете в виду, когда говорите, что мой пост в блоге - это "взлом", весь смысл в том, что он был построен дважды.
Сайед Ибрагим Хашими
Моя книга: Внутри Microsoft Build Engine: Использование MSBuild и Team Foundation Build
Я знаю, что документы MSDN полны ошибок и иногда вводят в заблуждение: вот что говорится о DefineConstants
Defines conditional compiler константы. Пары символ/значение разделяются точкой с запятой и задаются с помощью следующего синтаксиса:
symbol1 = value1 ; symbol2 = value2
Свойство эквивалентно ключу компилятора /define переключатель компилятора.
http://msdn.microsoft.com/en-us/library/bb629394.aspx
Согласно MSDN, вы можете 1. определить несколько констант и 2. (@Sayed) присваивать значения
HOWEVER Я не смог добиться ожидаемого поведения этого свойства задачи MSBuild и рекомендую обходной путь Джеффа Винна, а его пост должен быть помечен как ответ.
Обходной путь.
Допущения:
В MSBuild:
<DefineConstants>Debug;use_$(SomeEnumValue)</DefineConstants>
В WiX:
<?ifdef $(var.use_EnumValue1) ?>
...
<?elseif $(var.use_EnumValue2) ?>
...
<?endif?>