strange behavor....
Dan Stromberg
drsalists at gmail.com
Sat Nov 13 16:27:36 EST 2010
On Sat, Nov 13, 2010 at 5:46 AM, Tracubik <affdfsdfdsfsd at b.com> wrote:
> hi all,
> i've this on python 2.6.6:
>
> >>> def change_integer(int_value):
> ... int_value = 10
> ...
> ... def change_list(list):
> ... list[0] = 10
> ...
> ... a = 1
> ... l = [1,1,1]
> ...
> ... change_integer(a)
> ... change_list(l)
> ...
> ... print a
> ... print l
> 1
> [10, 1, 1]
>
> why the integer value doesn't change while the list value do?
> in Pascal i can choose the behavour of parametres, how this work on Python?
> also a link could be appreciated
>
> Thanks in advance
> Nico
> --
> http://mail.python.org/mailman/listinfo/python-list
>
$ cat python-argument-passing
#!/usr/bin/python
def assign_int(x):
print 'id(x) is %d' % id(x)
x = 5
# x is now a totally different integer, which won't be reflected in
# the caller, because id(x) has changed
print 'id(x) is %d' % id(x)
def assign_list(list_):
# list_ is initially a copy of the reference to list_1
print 'id(list_) is %d' % id(list_)
list_ = [ 'a', 'b', 'c' ]
# list_ is no a reference to a totally different list, as indicated
# by the change in id(). This too won't be reflected in the caller,
# because id(list_) has changed
print 'id(list_) is %d' % id(list_)
def assign_list_element(list_):
# list_ is initially a copy of the reference to list_2
print 'id(list_) is %d' % id(list_)
list_[1] = 101
# list_ is still a copy of the reference to list_2 - we only changed
# one thing in that list, not the list itself. This _will_ be
reflected
# in the caller, because we're still talking about the same list.
print 'id(list_) is %d' % id(list_)
x = 1
list_1 = [ 1, 2, 3 ]
list_2 = [ 4, 5, 6 ]
assign_int(x)
print 'x after assign_int(x): %d' % x
print
assign_list(list_1)
print 'list_1 after assign_list(list_1): %s' % list_1
print
assign_list_element(list_2)
print 'list_1 after assign_list_element(list_2): %s' % list_2
print
print 'The author likes to think of all this as pass by value - but'
print "when we pass a simple type like an int or float, we're passing"
print "the object itself, while for collections of things we're still"
print "passing the object itself, but that object _contains_ other things"
print "which can easily be changed from the caller's perspective as well."
benchbox-dstromberg:~/src/python-var-passing i686-pc-linux-gnu 10388 - above
cmd done 2010 Sat Nov 13 01:26 PM
$ ./python-argument-passing
id(x) is 157519248
id(x) is 157519200
x after assign_int(x): 1
id(list_) is 3077596300
id(list_) is 3077683052
list_1 after assign_list(list_1): [1, 2, 3]
id(list_) is 3077682092
id(list_) is 3077682092
list_1 after assign_list_element(list_2): [4, 101, 6]
The author likes to think of all this as pass by value - but
when we pass a simple type like an int or float, we're passing
the object itself, while for collections of things we're still
passing the object itself, but that object _contains_ other things
which can easily be changed from the caller's perspective as well.
benchbox-dstromberg:~/src/python-var-passing i686-pc-linux-gnu 10388 - above
cmd done 2010 Sat Nov 13 01:26 PM
HTH :)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20101113/e3e4a165/attachment-0001.html>
More information about the Python-list
mailing list