категории | RSS

'''Периодически начинающие питонщики пишут мне в лс с просьбой помочь разобраться в том или ином вопросе (полагая, что я типа шо-то шарю=)). Вопросы разные, и, на многие из них, мне приходится включать мозги, рыться в гугле, за что им спасибо. А, бывает, и нет, просто кто-то Сузи (и т.п.) не читал... По-разному. Вот щас с похожими проблемами обратились два участника сайта (совпадение какое-то). Вот. У меня щас в работе перерыв на неделю (из-за холодов разморозилась система отопления на объекте), а по-сему, дорогие друзья, я, с вашего позволенья, еще накачу сто грамм, и продолжу.
Уфф... Так вот, на чем я остановился?).. Давайте, к делу. Список, словарь. Ага, поняли, про что я?). Питон крут. Но, там, где вам дают волю действий, не избежать подводных камней. Давайте уже перейдем к примерам'''
my_list_sub = [] # Наш какой-то список, на каком-то этапе.
my_list = [] # Наш главный список.
my_list.append(my_list_sub) # Добавили видели что видели куда).
# Начинающий питонщик (многие), сделая:
my_list_copy = my_list[:]
# думает, что он создал копию изначального списка my_list, и, что-б он там в дальнейшем не делал с my_list, my_list_copy для него останется девственным. Проверим?:
my_list_sub.append('a')
print my_list
>>>
[['a']]
print my_list_copy
>>>
[['a']]
# Где наша копия?! =). Шучу. Это она и есть. Тут, думаю все ясно даже начинающим питонщикам. А если нет- вперед читать книги! (вместе со мной, конечно).
# Так что-ж делать, если надо первоначальный вид?
# Щас мы еще накатим, и к примерам!
import copy
my_list = []
my_dict = {}
my_list_copy = copy.deepcopy(my_list)
my_dict_copy = copy.deepcopy(my_dict)
# А теперь делайте, что хотите, с вашими первоначальными списком и словарем! Функция deepcopy из модуля copy (из коробки) возвратит вам ваши объекты, рекурсивно пройдя на максимальную глубину, в первоначальном виде.
# Критика и дополнения приветствуются! А пока, извиняйте, я- pass. Гости=)

dimy44
2012-02-14T16:51:21Z

Здесь находятся
всего 0. За сутки здесь было 0 человек

Комментарии 3

#3   Punk_Joker    

Давно интересовал этот вопрос, да никак не доходили руки разобраться.


0 ответить

#3   Virtuos86    


# один вариант
my_list_copy = [
{
list: (lambda: i[:]),
dict: (lambda: dict(i))
}.get(type(i), lambda: i)() for i in l]

# второй вариант
my_list_copy = [
{
list: isinstance(i, list) and i[:],
dict: isinstance(i, dict) and dict(i)
}.get(type(i), i) for i in l]

Проще никак, потому что пустые последовательности и контейнеры (списки, словари) имеют логическое значение \"ложь\". И в это упираешься.

-------------
Добавлено в 04.27: Если кому-то это кажется громоздким, то вот компактный вариант, избавленный от пробелов и скобок:
my_list_copy = [{list:lambda:i[:], dict:lambda:dict(i)}.get(type(i), lambda:i)() for i in l]


1 ответить

#3   FanatGD    

... потом еще накатим и чафгИфдопсефиы winked


0 ответить

Яндекс.Метрика