Уведомления

Группа в Telegram: @pythonsu

#1 Июль 18, 2010 14:25:43

pacman
От:
Зарегистрирован: 2010-07-18
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

копирование объекта

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import copy, random

class Genome:

__gens = []

def __init__(self, genomeSize, fillGenome=1):
for i in range(genomeSize):
self.__gens[i:] = [0]

if 1 == fillGenome:
for i in range(genomeSize):
self.__gens[i] = random.random()

def get(self):
return self.__gens

def mutation(self):
self.__gens[random.randrange(0, len(self.__gens))] = random.random()


genome = Genome(3)
print
print genome.get()
genome2 = copy.copy(genome)
genome2.mutation()
print genome.get()
print genome2.get()
после копирования объекта genome2, при его мутации соответственно изменяется и объект genome
если вместо списка изпользовать intовое число, то все срабатывает…
уже 2ой час сижу и не могу понять, почему не срабатывает копирование



Офлайн

#2 Июль 18, 2010 15:08:08

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

копирование объекта

# -*- coding: utf-8 -*-

import copy, random

class Genome:



def __init__(self, genomeSize, fillGenome=1):
self.__gens = []
for i in range(genomeSize):
self.__gens[i:] = [0]

if 1 == fillGenome:
for i in range(genomeSize):
self.__gens[i] = random.random()

def get(self):
return self.__gens

def mutation(self):
self.__gens[random.randrange(0, len(self.__gens))] = random.random()


genome = Genome(3)
print
print genome.get()
genome2 =copy.deepcopy(genome)
genome2.mutation()
print genome.get()
print genome2.get()
1.используйте deepcopy для полного копирования объекта.
2.__gens у вас атрибут класса, а не экземпляра, и также относится к изменяемому типу(читайте в любом учебнике питона), т.е. для всех экземпляров он один!
чтобы понять попробуйте:
# -*- coding: utf-8 -*-
import copy, random

class Genome:

__gens = []
def __init__(self, genomeSize, fillGenome=1):
for i in range(genomeSize):
self.__gens[i:] = [0]

if 1 == fillGenome:
for i in range(genomeSize):
self.__gens[i] = random.random()*100

def get(self):
return self.__gens

def mutation(self):
self.__gens[random.randrange(0, len(self.__gens))] = 'new'

genome = Genome(3)
print
print genome.get()
genome2 =copy.deepcopy(genome)
genome2.mutation()
print genome.get()
print genome2.get()
genome3 = Genome(5)
print '-'*15
print genome.get()
print genome2.get()
print genome3.get()



Отредактировано (Июль 18, 2010 15:19:25)

Офлайн

#3 Июль 18, 2010 15:17:35

pacman
От:
Зарегистрирован: 2010-07-18
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

копирование объекта

sp3, спасибо, заработало



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version