Python имеет ссылочную семантику. Как правило, a = b
заставляет имя a
ссылаться на то же значение, к которому относится имя b
. Он не создает и не сохраняет новое значение.
Вы можете клонировать список с помощью упомянутого трюка [:]. Более универсальным решением для копирования вещей является использование модуля copy
.
Однако хороший код Python обычно не требует явного копирования вещей очень часто. Вы должны ознакомиться с использованием списочных представлений для создания «модифицированных версий» существующих последовательностей. Например, мы можем реализовать сито как (демонстрируя еще несколько вещей):
import sys, argparse, math, itertools
parser = argparse.ArgumentParser(description='find the largest prime factor of a number')
parser.add_argument('n', type=int, help='number')
args = parser.parse_args()
# Using a loop over a 'range' to fill a list with increasing values is silly, because
# the range *is* a list of increasing values - that's how the 'for i in ...' bit works.
sieve = range(2, args.n + 1)
# We don't need to remember the original loop at all.
# Instead, we rely on each iteration of the sieve putting a new prime at the beginning.
for index in itertools.count(): # Counting upward,
if index >= len(sieve): break # until we run out of elements,
prime = sieve[index] # we grab the next prime from the list,
sieve = [x for x in sieve if x == prime or x % prime != 0] # and sieve the list with it.
# Of course, we can optimize that by checking that prime < sqrt(args.n), or whatever.
print sieve