"bill.wu" <[EMAIL PROTECTED]> wrote > i ask a easy question. > > why the first one have"x",the second one > doesn't have "x". what is different?
The first is using x as the name of a parameter of the function and is only used inside the function. The second one takes no parameter and relies on explicit knowlege that an variable called x exists in the global namespace. The second form is considered bad practice unless you have a very good reason to use it since it forces the function to know about things outside its control. > when write "x",when don't write "x". Using a parameter (usually called something more meaningful than x!) is normally the best way. Version 2 should be avoided if possible. > in my point,the second one don't def variable. Corect it uses the global variable defined at the module level. That is why the global statement is used. > (1) > > def func(x): > print 'x is', x > x = 2 > print 'Changed local x to', x > > x = 50 > func(x) > print 'x is still', x (2) This defines a global x with value 50. It then calls func passing in the value 50 to the parameter x which acts like a local variable, only seen inside the function. The func internally assigns a value of 2 to that local x which does not affect the global x. It then prints the local value and exits The next line of code then prints the global x to show that it has not changed. If a different name had been used for the parameter it would be much clearer but I assume the author is trying to demonstrate how names are controlled. def func(y): print 'y =',y y = 2 print 'y =',y x = 50 func(x) print 'x =',x The code here is identical in function to the first version but because we chose y as the parameter name it is obvious that they are different variables. > def func(): > global x > > print 'x is', x > x = 2 > print 'Changed local x to', x This function has no local variables and instead acts on the global x. It could be better written with a parameter like this: def func(y) print 'y =',y y = 2 print 'y=',y return y # allows it to affect the global > x = 50 > func() And this line becomes x = func(x) > print 'Value of x is', x Now x will reflect the changes made by func() You will find more about namespaces in the "Whats in a name?" topic of my tutorial. HTH, -- Alan Gauld Author of the Learn to Program web site http://www.freenetpages.co.uk/hp/alan.gauld _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor