Я думаю, что ответ на этот вопрос заключается в том, как python передает данные в параметр (передать по значению или по ссылке), а не изменчивость или как питон обрабатывает инструкцию «def».
Краткое введение. Во-первых, в питоне есть два типа типов данных: один простой элементарный тип данных, например числа, а другой тип данных - объекты. Во-вторых, при передаче данных в параметры python передает элементарный тип данных по значению, т. Е. Делает локальную копию значения локальной переменной, но передает объект по ссылке, т. Е. Указывает на объект.
Признавая вышеуказанные два момента, давайте объясним, что произошло с кодом python. Это происходит только из-за передачи по ссылке для объектов, но не имеет ничего общего с mutable / immutable или, возможно, факта, что оператор «def» выполняется только один раз, когда он определен.
[] является объектом , поэтому python передает ссылку [] на a
, т. е. a
является только указателем на [], который лежит в памяти как объект. Существует только одна копия [] с, однако, многими ссылками на нее. Для первого foo () список [] изменен на 1 методом добавления. Но учтите, что существует только одна копия объекта списка, и этот объект теперь становится 1 . При запуске второго foo (), какая веб-страница effbot говорит (элементы больше не оцениваются) неверна. a
оценивается как объект списка, хотя теперь содержимое объекта 1 . Это эффект прохождения по ссылке! Результат foo (3) может быть легко получен таким же образом.
Чтобы еще раз подтвердить мой ответ, давайте рассмотрим два дополнительных кода.
===== = № 2 ========
def foo(x, items=None):
if items is None:
items = []
items.append(x)
return items
foo(1) #return [1]
foo(2) #return [2]
foo(3) #return [3]
[]
- это объект, поэтому None
(первый является изменяемым, в то время как последний является неизменным, но изменчивость не имеет ничего что касается вопроса). Никто не находится где-то в пространстве, но мы знаем, что он есть, и там есть только одна копия «Нет». Таким образом, каждый раз, когда вызывается foo, элементы оцениваются (в отличие от некоторого ответа, который оценивается только один раз) равны None, чтобы быть ясным, ссылка (или адрес) None. Затем в foo элемент изменяется на [], т. Е. Указывает на другой объект, который имеет другой адрес.
====== № 3 =======
def foo(x, items=[]):
items.append(x)
return items
foo(1) # returns [1]
foo(2,[]) # returns [2]
foo(3) # returns [1,3]
Вызов элемента foo (1) указывает на объект списка [] с адрес, скажем, 11111111. содержимое списка будет изменено на 1 в функции foo в дальнейшем, но адрес не изменится, еще 11111111. Тогда foo (2, []) является приходит. Хотя [] в foo (2, []) имеет тот же контент, что и параметр по умолчанию [] при вызове foo (1), их адрес отличается! Поскольку мы предоставляем параметр явно, items
должен принять адрес этого нового []
, скажем 2222222, и вернуть его после внесения некоторых изменений. Выполняется foo (3). поскольку предоставляется только x
, элементы должны снова принимать значение по умолчанию. Что такое значение по умолчанию? Он задается при определении функции foo: объект списка, расположенный в 11111111. Таким образом, элементы оцениваются как адрес 11111111, имеющий элемент 1. Список, расположенный в 2222222, также содержит один элемент 2, но он не указывается элементами any Больше. Следовательно, добавление 3 сделает items
[1,3].
Из приведенных выше объяснений видно, что веб-страница effbot , рекомендованная в принятом ответе, не дала соответствующего ответа на этот вопрос. Более того, я думаю, что точка на веб-странице effbot неверна. Я думаю, что код UI.Button верен:
for i in range(10):
def callback():
print "clicked button", i
UI.Button("button %s" % i, callback)
Каждая кнопка может содержать определенную функцию обратного вызова, которая будет отображать различное значение i
. Я могу привести пример, чтобы показать это:
x=[]
for i in range(10):
def callback():
print(i)
x.append(callback)
Если мы выполним x[7]()
, мы получим 7, как ожидалось, и x[9]()
даст 9, другое значение i
.
Я думаю, что самое простое правило:
RedirectMatch 403 ^.*/sub/folder/index\.php$
RedirectMatch находится в модуле mod_alias, который вы, безусловно, имеете. Это не означает двигатель mod_rewrite. Здесь мы просто говорим apache, что любой доступ к sub / folder / index.php будет генерировать «403 запрещенный» ответ.
Вы можете поместить это в httpd.conf или в корневой .htaccess (но действительно считаю, что удалить все .htaccess, это плохо, это медленно, грустно, что у вас нет доступа к реальным файлам конфигурации).
Я пытаюсь создать еще один .htaccess в этой суб / папке /, чтобы заблокировать доступ к этому index.php.
«Если вы поместите файл .htaccess в подпапку, его директивы будут отменять те, которые у вас есть в основной папке вашего сайта. "
На этой странице есть дополнительная информация: http://www.besthostratings.com/articles/htaccess.html
.htacess
. Здесь не так полезно.
– Halcyon
10 January 2012 в 18:47
Вы можете использовать имена файлов только в разделах <Файлы>>, а не пути.
Есть три варианта, которые я могу видеть:
-
RewriteEngine on
RewriteRule ^sub/folder/index.php$ http://yoursite/index.locked
Дает 404 файла, если вы хотите, чтобы разрешение было отклонено, создайте защищенный файл для чтения в указанном местоположении.
RewriteOptions inherit
и RewriteBase
объявление родителя, но я не могу предоставить это, потому что моя среда динамична. Мне всегда кажется удивительным, как совершенно бесполезный .htaccess - это когда у вас есть модульные структуры.
– Halcyon
10 January 2012 в 17:36
RewriteRule
s в родительском файле .htaccess
не применяются, если вы не добавите RewriteOptions inherit
. Но тогда правило не запускается, потому что RewriteBase
установлен в дочерний каталог. Я не могу сбросить RewriteBase
, потому что я этого не знаю (из-за модульности). Решение будет заключаться в генерации i> .htaccess файлов при развертывании приложения, но я считаю, что это скорее недостаток дизайна, чем что-либо еще, он существует уже довольно долгое время.
– Halcyon
10 January 2012 в 18:37
Как создать файл .htaccess
в определенной папке, содержащей файлы, которые вы хотите защитить?
Изменить:
Будьте осторожны, это фактически не работает в простой .htaccess
, см. комментарии ниже. Это будет работать только в файле apache.conf.
Это должно сделать трюк для вас без другого файла .htaccess
:
<Directory sub/folder>
<Files index.php>
Order allow,deny
Deny from all
</Files>
</Directory>
RedirectMatch
обрабатывается отдельно отRewriteRule
– Halcyon 10 January 2012 в 18:41RedirectMatch 403 ^.*/wp-content/themes/(.*)/index\.php$
– squarecandy 10 June 2014 в 18:47