что делает вызов метода? - PullRequest
       4

что делает вызов метода?

0 голосов
/ 01 августа 2011

ок, вопрос нуб

У меня был этот код

           list = ['random', 'set', 'of', 'strings']
           for item in list:
               item.replace('a','b')

           print list

вывод не показывает замену, если я не изменю код на

            list = ['random', 'set', 'of', 'strings']
            for item in list:
                item = item.replace('a','b')

            print list

так что мой вопрос, что именно происходит?почему первый пример не присваивается автоматически?

Ответы [ 3 ]

5 голосов
/ 01 августа 2011

Метод просто , возвращающий новое значение, он не изменяет существующее.

Не существует установленных правил, которые указывают, что все или никакие методы будут делать это, вы будетенужно проверить документацию для каждого, чтобы точно знать, что он делает и чего ожидать.

Многие функции похожи на это.

Возьмем это:

a = 1
b = 2
c = Add(a, b)

Вы ожидаете, что у a или b появятся новые значения в этой точке?Это точно такая же вещь.

Теперь, сказав, что есть еще одна проблема с вашим кодом.Ни при каких обстоятельствах этот список фактически не изменится.

Почему?Поскольку вы не обновляете список , вы обновляете элемент .

И элемент является «копией» значения всписок.Это не совсем правильно, но этого ответа достаточно (узнайте о ссылках для получения дополнительной информации.)

Другими словами, если вы измените два примера на этот:

list = ['random', 'set', 'of', 'string']
for item in list:
    item.replace('a','b')
    print item

vs.

list = ['random', 'set', 'of', 'string']
for item in list:
    item = item.replace('a','b')
    print item

, тогда вы увидите разницу.

Ответ на дополнительный вопрос в комментарии : Если вы не сохранитерезультат где угодно, он просто потерян.Подумайте об этом так: вы звоните своему другу и спрашиваете, сколько времени у него на часах.Он говорит «10:45», а вы отвечаете «на самом деле мне все равно нажмите ».

4 голосов
/ 01 августа 2011

Второй тоже не так

list = [item.replace('a','b') for item in list]
1 голос
/ 01 августа 2011
list = ['random', 'set', 'of', 'strings']
for item in list:
    item.replace('a','b')
print list

'random' - строковый объект, 'set' - строковый объект и т. Д.

список - это набор строковых объектов

for item in list:
присваивает имя (он же идентификатор) элемент последовательно каждому из объектов, перечисленных в объекте list .Назначение означает, что связь между именем и объектом создается.

Для каждого поворота цикла после присвоения item текущему объекту list , item.replace('a','b') выполняется:
replace () создает новый объект, имеющий то же значение, что и объект с именем item , но с заменой 'a' на 'b'.
Где происходит это творение?В памяти.Новый объект физически создается где-то в ОЗУ, у объекта есть адрес, тип и значение.
А потом?Ну, а потом ничего.Объект находится там, в ОЗУ, и ему не присваивается имя.Таким образом, он умрет более или менее быстро, то есть биты, занятые новым объектом, будут повторно использоваться более или менее быстро, без какой-либо заботы об интерпретаторе, потому что у него нет возможности узнать, что там находится объект, так какна этот объект не ссылается идентификатор.

.

list = ['random', 'set', 'of', 'strings']
for item in list:
    item = item.replace('a','b')
print list

Это происходит примерно так же.Разница в том, что после создания объект, полученный из инструкции item.replace('a','b'), присваивается имени item .Или, если хотите, имя item переназначается новому объекту.
Итак, новый объект не умрет?Увы, так и будет.Поскольку при следующем повороте цикла инструкция for item in list выполняет новое присвоение имени item следующему элементу list

.

Теперь вы также должны понимать, почему не рекомендуется называть список с именем list .Поскольку list - это имя встроенной функции, а определение list = ['random', 'set', 'of', 'strings'] имеет следствие: оригинальная встроенная привязка между именем list и объектной функцией list () не работает и заменяется связыванием между list и вышеуказанным набором строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...