hey,
okay, I'm trying to figure out why my books: Quick Python, Python in a
Nutshell, Python Cookbook and Learning Python don't say anything about the
weird behavior of a list when you have one as an object instance member.
for instance (my first pun of 2004), if I have,
test.py
----------------
global_filegroup_array = [] # array of filegroup objects
class FileGroup:
a = 0
mylist = [] # here it is
def put_stuff_in_my_list(self, anyfile):
self.mylist.append( get just a single string from file) #
pls excuse the psuedo
def __init__(self):
put_stuff_in_my_list(anyfile)
def main(): # do ten times: instantiate the
above object, and add to the global array
for i in xrange(10):
filegroup = FileGroup()
global_filegroup_array.append(filegroup)
# print the list contents
print global_filegroup_array[0].mylist
------------ end of file
Output is: [u'.string1', u'.string2', u'.string3' ] # only
u'string1' should show up
No matter which index I use into the global array, I always get ALL of
the strings
showing up. I should only get u'string1' showing up, and u'string2'
if
I used "[1].mylist"
How I resolved it, is by slipping in
self.mylist = []
before
put_stuff_in_my_list(anyfile)
in __init__(self)
Why should I have to empty out the list when it's a member of a newly
instantiated object?
thanks
p.s. ( I'm actually not doing exactly the thing with the
files, but instead iterating through a xml file with dom,
debugging it showed the behavior ) 5 1435
In article <ff*****************@newssvr29.news.prodigy.com> , python
newbie <me*******@hotmail.com> writes
I think you're not grokking that using
class A:
mylist = []
makes mylist a class attribute ie all instances share the same version
of mylist. To get an instance version you need to assign self.mylist.
That would normally be done using an __init__method. so
class A:
def __init__(self):
self.mylist = []
then each instance sets up its own empty list at creation time.
Hope that helps.
--
Robin Becker
python newbie wrote: test.py ----------------
global_filegroup_array = [] # array of filegroup objects
class FileGroup: a = 0 mylist = [] # here it is
This is a class variable, not a member or instance variable. Make
sure you know the difference.
def put_stuff_in_my_list(self, anyfile): self.mylist.append( get just a single string from file)
This line creates a member variable "mylist" of the current instance
"self" of class "FileGroup" as a copy of the class variable
"FileGroup.mylist".
Just create your member variables in the c'tor function __init__.
This should solve all your problems (ok, at least this problem;)
And btw. Python in a nutshell (I haven't read the other books you've
mentioned) explains the differences between class and member
variables.
Mathias
In article <ff*****************@newssvr29.news.prodigy.com> , python newbie wrote: hey, okay, I'm trying to figure out why my books: Quick Python, Python in a Nutshell, Python Cookbook and Learning Python don't say anything about the weird behavior of a list when you have one as an object instance member.
for instance (my first pun of 2004), if I have,
test.py ----------------
global_filegroup_array = [] # array of filegroup objects
class FileGroup: a = 0 mylist = [] # here it is
mylist in this case is a class variable; what this means is that it is shared
amongst all *instances* of the class. Only if an instance of the class rebinds
mylist is it local to the particular class instance doing this. def put_stuff_in_my_list(self, anyfile): self.mylist.append( get just a single string from file) # pls excuse the psuedo
Because lists are mutable, when you use mylist.append(...) you don't rebind
mylist, but change its contents. Since mylist is a class variable, this
change is available to the class as well as all instances of the class. def __init__(self): put_stuff_in_my_list(anyfile)
def main(): # do ten times: instantiate the above object, and add to the global array for i in xrange(10): filegroup = FileGroup() global_filegroup_array.append(filegroup)
# print the list contents print global_filegroup_array[0].mylist
------------ end of file
Output is: [u'.string1', u'.string2', u'.string3' ] # only u'string1' should show up
No matter which index I use into the global array, I always get ALL of the strings showing up. I should only get u'string1' showing up, and u'string2' if I used "[1].mylist"
How I resolved it, is by slipping in
self.mylist = []
before
put_stuff_in_my_list(anyfile)
in __init__(self)
Why should I have to empty out the list when it's a member of a newly instantiated object?
Because __init__() is called when a class is about to be instantiated. You are
masking the *class variable* mylist with a local *instance variable* of the
same name. The latter is not shared amongst all instances of the class, but
remains unique to the particular instance.
Hope this helps,
/Troels Therkelsen
thanks for the helpful replies.
I guess I was just in confusion as to why I was able to leave alone the
string variables in class FileGroup, such
as sourceDir and destinDir, and nothing unpredictable happened with those,
but with the list variable, I had to treat differently.
But after I again read closely, Python In a Nutshell, I'm sure I will
understand.
"python newbie" <me*******@hotmail.com> wrote in message
news:ff*****************@newssvr29.news.prodigy.co m... hey, okay, I'm trying to figure out why my books: Quick Python, Python in a Nutshell, Python Cookbook and Learning Python don't say anything about the weird behavior of a list when you have one as an object instance member.
for instance (my first pun of 2004), if I have,
test.py ----------------
global_filegroup_array = [] # array of filegroup objects
class FileGroup: a = 0 mylist = [] # here it is
def put_stuff_in_my_list(self, anyfile): self.mylist.append( get just a single string from file) # pls excuse the psuedo
def __init__(self): put_stuff_in_my_list(anyfile)
def main(): # do ten times: instantiate the above object, and add to the global array for i in xrange(10): filegroup = FileGroup() global_filegroup_array.append(filegroup)
# print the list contents print global_filegroup_array[0].mylist
------------ end of file
Output is: [u'.string1', u'.string2', u'.string3' ] # only u'string1' should show up
No matter which index I use into the global array, I always get ALL of the strings showing up. I should only get u'string1' showing up, and u'string2' if I used "[1].mylist"
How I resolved it, is by slipping in
self.mylist = []
before
put_stuff_in_my_list(anyfile)
in __init__(self)
Why should I have to empty out the list when it's a member of a newly instantiated object?
thanks
p.s. ( I'm actually not doing exactly the thing with the files, but instead iterating through a xml file with dom, debugging it showed the behavior )
I didn't say that right. I meant to say that I now finally understood
what's going on now, with your replies, but I will take a slight break from
the app I'm writing, and do some ingesting of the core Python concepts.
"python newbie" <me*******@hotmail.com> wrote in message
news:Vf****************@newssvr29.news.prodigy.com ... thanks for the helpful replies. I guess I was just in confusion as to why I was able to leave alone the string variables in class FileGroup, such as sourceDir and destinDir, and nothing unpredictable happened with those, but with the list variable, I had to treat differently. But after I again read closely, Python In a Nutshell, I'm sure I will understand. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Charlotte Henkle |
last post by:
Hello;
I'm pondering how to count the number of times an item appears in
total in a nested list. For example:
myList=,,]
I'd like to know that a appeared three times, and b appeared twice,...
|
by: Jacek Dziedzic |
last post by:
Hi!
A) Why isn't it possible to set a member of the BASE class in
an initialization list of a DERIVED class constructor (except for
'calling' the base constructor from there, of course)? I even...
|
by: Jacek Dziedzic |
last post by:
Hello!
Suppose I have a class Foo that defines a default c'tor
that initializes some data using an initialization list:
Foo::Foo() : member1(0), member2(0), member3(NULL), member4(20)
// and...
|
by: V_S_H_Satish |
last post by:
Dear Friends
I am working as oracle and ms sql dba from last 4 years. My company
recently migrated to DB2 databases.
So i am very much new to db2 database
Can any one pls provide script to...
|
by: pasa_1 |
last post by:
Can someone clarify few items from FAQ
http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6
' Should my constructors use "initialization lists" or
"assignment"?'
a. This might happen...
|
by: =?Utf-8?B?QkogU2FmZGll?= |
last post by:
We have a class that has a public property that is of type List<T>. FXCop
generates a DoNotExposeGenericLists error, indicating
"System.Collections.Generic.List<Tis a generic collection designed...
|
by: Jeremy Lynch |
last post by:
Hello,
Learning python from a c++ background. Very confused about this:
============
class jeremy:
list=
def additem(self):
self.list.append("hi")
return
|
by: Jeff |
last post by:
..NET 2.0
Is generic lists faster then tradional lists when sending over a collection
of objects (value by reference) in .NET remoting.
Lets say if a list of object should be sent from a...
|
by: John A Grandy |
last post by:
InstrumentPropertyEntity
string Name
InstrumentEntity
string Name
List<InstrumentPropertyEntityInstrumentProperties
For a List<InstrumentEntity, I want to determine the...
|
by: Charles Arthur |
last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
|
by: emmanuelkatto |
last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud.
Please let me know.
Thanks!
Emmanuel
|
by: BarryA |
last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
|
by: Sonnysonu |
last post by:
This is the data of csv file
1 2 3
1 2 3
1 2 3
1 2 3
2 3
2 3
3
the lengths should be different i have to store the data by column-wise with in the specific length.
suppose the i have to...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers,...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
| |