0

So Ι have this python example:

In [1]: a=['1']

In [2]: b=a

In [3]: a[0] = int(a[0]) 

In [4]: type(a[0])
Out[4]: int

In [5]: type(b[0])
Out[5]: int

Why is b[0] an int and not a str?

How can Ι fix the problem?

inspectorG4dget
  • 110,290
  • 27
  • 149
  • 241
Ron
  • 197
  • 1
  • 10

2 Answers2

1

This is because when you say b=a, python doesn't create a new list for b, with a copy of the elements in a. Rather, b is just another name for a, and points to the same location in memory. Whatever memory address holds the stuff that we call a is the same memory address that holds the stuff we call b. Since only one entity may occupy a given memory address at a given time, a and b are effectively synonyms - like giving your friend a nickname.

This can be verified with id(...):

In [46]: a=['1']

In [47]: b=a

In [48]: id(a)==id(b)
Out[48]: True

Since lists are mutable, when you change the value of some index of a list, a new list is not created. Rather, the entity at the corresponding memory address of that list is replaced with a different entity.

So, back to that analogy about b=a being like giving your friend a nickname: If your friend's name is John, and your nickname for him is "J" (how unimaginative! I clearly need some coffee). Then if John dyes his hair blue, well then so has J. J doesn't manage to retain his hair color despite John having done so.

Similarly, b doesn't get to keep the '1', despite a having changed.

Hope this helps

inspectorG4dget
  • 110,290
  • 27
  • 149
  • 241
0

This is not a problem, it's how Python works.
When you create a variable in Python you are creating a variable name which is a reference to an object.

So what is happening here is that you are creating a list object containing the string '1', and referencing this object with name a.
This line b = a will create a new name b which is also referencing the object ['1']. Since list is a mutable object a[0] = int(a[0]), will change in place the type of (string) '1' to (int) 1.
So because a and b are referencing the same object both will be type of int.

igavriil
  • 1,001
  • 2
  • 12
  • 18