Python assigning multiple variables to same value? list behavior -


i tried use multiple assignment show below initialize variables, got confused behavior, expect reassign values list separately, mean b[0] , c[0] equal 0 before.

a=b=c=[0,3,5] a[0]=1 print(a) print(b) print(c) 

result is: [1, 3, 5] [1, 3, 5] [1, 3, 5]

is correct? should use multiple assignment? different this?

d=e=f=3 e=4 print('f:',f) print('e:',e) 

result: ('f:', 3) ('e:', 4)

if you're coming python language in c/java/etc. family, may stop thinking a "variable", , start thinking of "name".

a, b, , c aren't different variables equal values; they're different names same identical value. variables have types, identities, addresses, , kinds of stuff that.

names don't have of that. values do, of course, , can have lots of names same value.

if give notorious b.i.g. hot dog,* biggie smalls , chris wallace have hot dog. if change first element of a 1, first elements of b , c 1.

if want know if 2 names naming same object, use is operator:

>>> a=b=c=[0,3,5] >>> b true 

you ask:

what different this?

d=e=f=3 e=4 print('f:',f) print('e:',e) 

here, you're rebinding name e value 4. doesn't affect names d , f in way.

in previous version, assigning a[0], not a. so, point of view of a[0], you're rebinding a[0], point of view of a, you're changing in-place.

you can use id function, gives unique number representing identity of object, see object when is can't help:

>>> a=b=c=[0,3,5] >>> id(a) 4473392520 >>> id(b) 4473392520 >>> id(a[0]) 4297261120 >>> id(b[0]) 4297261120  >>> a[0] = 1 >>> id(a) 4473392520 >>> id(b) 4473392520 >>> id(a[0]) 4297261216 >>> id(b[0]) 4297261216 

notice a[0] has changed 4297261120 4297261216—it's name different value. , b[0] name same new value. that's because a , b still naming same object.


under covers, a[0]=1 calling method on list object. (it's equivalent a.__setitem__(0, 1).) so, it's not really rebinding @ all. it's calling my_object.set_something(1). sure, object rebinding instance attribute in order implement method, that's not what's important; what's important you're not assigning anything, you're mutating object. , it's same a[0]=1.


user570826 asked:

what if have, a = b = c = 10

that's same situation a = b = c = [1, 2, 3]: have 3 names same value.

but in case, value int, , ints immutable. in either case, can rebind a different value (e.g., a = "now i'm string!"), won't affect original value, b , c still names for. difference list, can change value [1, 2, 3] [1, 2, 3, 4] doing, e.g., a.append(4); since that's changing value b , c names for, b b [1, 2, 3, 4]. there's no way change value 10 else. 10 10 forever, claudia vampire 5 forever (at least until she's replaced kirsten dunst).


* warning: not give notorious b.i.g. hot dog. gangsta rap zombies should never fed after midnight.


Comments

Popular posts from this blog

linux - Does gcc have any options to add version info in ELF binary file? -

android - send complex objects as post php java -

charts - What graph/dashboard product is facebook using in Dashboard: PUE & WUE -