RAHUL SINGH INDA
RAHUL SINGH INDA

Reputation: 1

Python list is getting auto updated even if not assigned any other value

The list bin_bd value gets changed even if not altered; the program is for binning method extracting data from a CSV file. I want to try all binning methods.

But the list keeps getting updated. Why is that?

import random
import math
f=open('book3.csv','w')

for i in range(0,12):
    e=str(random.randint(0,10))
    f.write(e+'\n')
f.close()

z=[]
f=open('book3.csv','r+')
while True:
    l=f.readline()
    if not l : break
    z.append(int(l))
f.close()
z.sort()

bin_out=[]
bin_mean=[]
bin_bd=[]
bin_no=input('Enter no of bins')
bsize=int (math.ceil(len(z)/bin_no))

print bsize
count=0
for i in range(bin_no):
    bins1=[]
    for j in range(bsize):
       if(count<len(z)) :
           print count
           bins1.append(z[count])
           count+=1
    bin_out.append(bins1)
    bin_mean.append(bins1)
    bin_bd.append(bins1)


print "bins formed "
print bin_mean
print "Smoothing methods"
print bin_bd
binn1=[]
for i in bin_mean:
    binn1.append(i)
print "By Mean"
p=[]
for i in range(len(bin_mean)):
    k= sum(bin_mean[i])/bsize
    p.append(k)


for i in range(len(binn1)):
 for j in range(bsize):
  binn1[i][j]=p[i]
print binn1

print "by Boundary "

p=[]
binn2=[[]]

print bin_bd

for j in range(0,4):

        #print j
        if (j==0 or j== bsize//1):
            print " "
        elif(j-0>j-bsize):
            #print main[i][0]
            binn2.append(bin_bd[i][0])

        else:
            binn2.append(bin_bd[i][bsize])

#print binn2

Upvotes: 0

Views: 33

Answers (1)

Barmar
Barmar

Reputation: 781964

When you do:

bin_out.append(bins1)
bin_mean.append(bins1)
bin_bd.append(bins1)

all three lists contain references to the same bins1 lists. Then later you do:

for i in bin_mean:
    binn1.append(i)

so binn1 also contains references to the same lists. Finally, you do:

binn1[i][j]=p[i]

This modifies the lists that all 4 variables refer to.

You should make copies of the lists:

bin_out.append(bins1[:])
bin_mean.append(bins1[:])
bin_bd.append(bins1[:])
...
for i in bin_mean:
    binn1.append(i[:])

BTW, that loop can be done with a list comprehension:

binn1 = [i[:] for i in bin_mean]

Upvotes: 2

Related Questions