Собственно, это именно то, чего вы ожидаете. Давайте разложим, что здесь происходит:
Вы пишете
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, что приводит к другому списку.
Анализ и объяснение:
Сообщение override r--r--r-- ...?
появляется в некоторых версиях команды rm, когда вы пытаетесь удалить файл или файлы с помощью команды rm, у которых есть доступ для записи. удален.
Воспроизвести:
▶ mkdir -p foo/{bar,baz} ; touch foo/bar/qux
▶ chmod -R -w foo
▶ find foo -ls
4305147410 0 dr-xr-xr-x 4 alexharvey wheel 128 24 Mar 18:19 foo
4305147412 0 dr-xr-xr-x 2 alexharvey wheel 64 24 Mar 18:19 foo/baz
4305147411 0 dr-xr-xr-x 3 alexharvey wheel 96 24 Mar 18:19 foo/bar
4305147413 0 -r--r--r-- 1 alexharvey wheel 0 24 Mar 18:19 foo/bar/qux
Теперь, если вы попытаетесь удалить эти файлы, вас спросят, действительно ли вы хотите переопределить этот файловый режим:
▶ rm -r foo
override r-xr-xr-x alexharvey/wheel for foo/baz?
Обратите внимание, что если вы работаете в Mac OS X или другом варианте BSD, как это имеет место, то вы неправильно указали аргумент --force
, добавив его в конец командной строки, где он будет интерпретироваться как имя дополнительный файл для удаления.
▶ rm -rf foo
rm: foo/baz: Permission denied
rm: foo/bar/qux: Permission denied
rm: foo/bar: Permission denied
rm: foo: Directory not empty
Исправление:
Чтобы исправить это, сначала восстановите разрешение на запись в папке:
▶ chmod -R +w foo
Тогда rm -r должен работать нормально:
▶ rm -r foo
▶ ls foo
ls: foo: No such file or directory
См. Также: