myList = [[1]*4] * 3
создает один объект списка [1,1,1,1]
в памяти и копирует его ссылку 3 раза. Это эквивалентно obj = [1,1,1,1]; myList = [obj]*3
. Любая модификация obj
будет отражена в трех местах, где obj
упоминается в списке. Правильным утверждением будет:
myList = [[1]*4 for _ in range(3)]
или
myList = [[1 for __ in range(4)] for _ in range(3)]
. Важно отметить, что *
оператор в основном используется для создания список литералов. Поскольку 1
является литералом, значит, obj =[1]*4
создаст [1,1,1,1]
, где каждый 1
будет атомарным, а не ссылкой 1
, повторяемым 4 раза. Это означает, что если мы obj[2]=42
, то obj
станет [1,1,42,1]
не [42,42,42,42]
, как могут предположить некоторые.
Относительно вашего первого вопроса: вы можете создать родительский pom для всего вашего проекта. В этом родительском модуле вы можете добавить раздел dependencyManagement, где вы можете перечислить свои собственные модули с их версией. В ваших модулях вам нужно только указать зависимость без версии.
Вот пример:
в родительском pom:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>yourgroup</groupId>
<artifactId>yourmoduleA</artifactId>
<version>3.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>yourgroup</groupId>
<artifactId>yourmoduleB</artifactId>
<version>3.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
, и если ваш модуль A использует модуль B, вы можете добавить в pom модуля A
<dependencies>
<dependency>
<groupId>yourgroup</groupId>
<artifactId>yourmoduleB</artifactId>
</dependency>
</dependencies>
В вашем многомодульном проекте вы обычно используете только одну версию для всех модулей. Это означает, что вы можете определить зависимости между модулями с <version>${project.version}</version>
, где свойство ${project.version}$
разрешается во время сборки. Maven собирает все модули в правильном порядке.