osdir.com


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Tutor] beginning to code


On Fri, Sep 22, 2017 at 9:24 PM, Marko Rauhamaa <marko at pacujo.net> wrote:
> bartc <bc at freeuk.com>:
>
>> On 22/09/2017 10:23, Marko Rauhamaa wrote:
>>> However, Python doesn't need any language changes to implement memory
>>> slots. A memory slot could be defined as any object that implements
>>> "get()" and "set(value)" methods:
>>
>> I didn't understand your examples.
>>
>> Can Python be used to write, say, a swap() function that works with any
>> argument types (not just classes or lists)? Example:
>>
>>     def swap(&a,&b):        # made up syntax
>>         a, b = b, a
>>
>>     x=10
>>     y="Z"
>>     swap(x,y)
>>     print (x,y)             # "Z" and "10"
>
> Yes, following my recipe:
>
>    def swap(ref_a, ref_b):
>        a, b = ref_a.get(), ref_b.get()
>        ref_a.set(b)
>        ref_b.set(a)
>
>    x = 10
>    y = "Z"
>    swap(slot_ref(locals(), "x"), slot_ref(locals(), "y"))
>    print(x, y)             # "Z" and 10

Sure, let me just put that into a function. CPython 3.7, although I'm
pretty sure most CPython versions will do the same, as will several of
the other Pythons.

(Side point: Your slot_ref function is rather bizarre. It's a closure
AND a class, just in case one of them isn't sufficient. The following
code is copied and pasted from two of your posts and is unchanged
other than making try_swapping into a function.)

>>> def slot_ref(dict_or_array, key_or_index):
...        class SlotRef:
...            def get(self): return dict_or_array[key_or_index]
...            def set(self, value): dict_or_array[key_or_index] = value
...        return SlotRef()
...
>>> def swap(ref_a, ref_b):
...        a, b = ref_a.get(), ref_b.get()
...        ref_a.set(b)
...        ref_b.set(a)
...
>>> def try_swapping():
...    x = 10
...    y = "Z"
...    swap(slot_ref(locals(), "x"), slot_ref(locals(), "y"))
...    print("x, y =", x, y)
...
>>> try_swapping()
x, y = 10 Z

Strange... doesn't seem to work. Are you saying that Python is
pass-by-reference outside of a function and pass-by-value inside?
Because that'd be just insane.

Or maybe what you have here isn't a real reference at all.

ChrisA