Easy questions from a python beginner

MRAB python at mrabarnett.plus.com
Sun Jul 11 22:09:12 EDT 2010


Alf P. Steinbach /Usenet wrote:
> * MRAB, on 12.07.2010 00:37:
>> Alf P. Steinbach /Usenet wrote:
>>> * Stephen Hansen, on 11.07.2010 21:00:
>>>> On 7/11/10 11:45 AM, wheres pythonmonks wrote:
>>>>> Follow-up:
>>>>> Is there a way to define compile-time constants in python and have the
>>>>> bytecode compiler optimize away expressions like:
>>>>>
>>>>> if is_my_extra_debugging_on: print ...
>>>>>
>>>>> when "is_my_extra_debugging" is set to false? I'd like to pay no
>>>>> run-time penalty for such code when extra_debugging is disabled.
>>>>
>>>> Any code wrapped in a __debug__ guard is utterly ommitted if you run
>>>> Python with the -O option. That, and asserts go away.
>>>>
>>>>> On #2: My point regarding the impossibility of writing the swap
>>>>> function for ints is to explicitly understand that this isn't
>>>>> possible, so as not to look for solutions along those lines when
>>>>> trying to write python code.
>>>>
>>>> Its impossible because Python's calling and namespace semantics simply
>>>> don't work like that. There's no references in the traditional sense,
>>>> because there's no variables-- boxes that you put values in. There's
>>>> just concrete objects. Objects are passed into the function and given
>>>> new names; that those objects have names in the enclosing scope is
>>>> something you don't know, can't access, and can't manipulate.. even the
>>>> objects don't know what names they happen to be called.
>>>>
>>>> Check out http://effbot.org/zone/call-by-object.htm
>>>
>>> Oh, I wouldn't give that advice. It's meaningless mumbo-jumbo. Python
>>> works like Java in this respect, that's all; neither Java nor Python
>>> support 'swap'.
>>>
>>> Of course there are variables, that's why the docs call them variables.
>>>
>> In Java a variable is declared and exists even before the first
>> assignment to it. In Python a 'variable' isn't declared and won't exist
>> until the first 'assignment' to it.
> 
> That is a misconception.
> 
> In Python a variable is declared by having an assignment to it, which 
> for a local variable may be anywhere within a routine.
> 
> If such a variable is used before it's been assigned to, then you get an 
> uninitialized variable exception. Clearly the variable must exist in 
> order for the exception to refer to it (not to mention the exception 
> occurring at all).
> 
>   def foo():
>       print( blah )
>       blah = "this is both an assignment and a declaration causing it to 
> exist"
> 
>   foo()
> 
> Clearly when the exception is raised, referring to the variable, the 
> variable exists.
> 
> Contrary to your statement that is before the assignment.
> 
> However, as stated up-thread, I do not expect facts, logic or general 
> reasoning to have any effect whatsoever on such hard-core religious 
> beliefs. And I do not care whether I convince you or not. But I *do not* 
> want the religious subset of the community to succeed too much in 
> propagating nonsense idiot beliefs to newbies  --  hence the concrete 
> example that any newbie can try.
> 
How about this:

 >>> def foo():
	print("Before:", locals())
	x = 0
	print("After:", locals())

	
 >>> foo()
Before: {}
After: {'x': 0}



More information about the Python-list mailing list