if var1 equals 1, and you run var2 = var1, that sets var2 to 1.

if list1 equals [1, 2, 3], and you run list2 = list1, that sets list2 to list1

so if you then run var1 = 2, var2 will still be 1

but if you run list1 = [3, 2, 1], list2 will give [3, 2, 1]

  • gedhrel@lemmy.world
    link
    fedilink
    arrow-up
    17
    ·
    15 hours ago

    It won’t (using your example explicitly) but in general what you’ve discovered is that:

    1. Variables hold values
    2. Some of those values are references to shared mutable objects.

    Lists fall into the second category. There are ways to copy lists if you want distinct behaviour.

    list2 = list1[:]
    

    will perform a “shallow copy”. If you have a list of lists, however, the nested lists are still shared references. There is copy.deepcopy available to make a complete clone of something (including all its nested members).

      • marcos@lemmy.world
        link
        fedilink
        arrow-up
        3
        ·
        14 hours ago

        Every variable in Python is actually a reference (maybe optimized out, but still logically a reference). There’s no difference.

        Numbers, booleans, and None won’t give you that kind of problem only because you can’t change them.

        • nickwitha_k (he/him)@lemmy.sdf.org
          link
          fedilink
          arrow-up
          1
          ·
          8 hours ago

          True. Since it’s all interpreted, it doesn’t act like primitives in things like C and everything is an object, that is a ref of some sort. However, there is a difference between how Python “primitives” and Python collections work within the language syntax.

          • marcos@lemmy.world
            link
            fedilink
            arrow-up
            1
            ·
            5 hours ago

            Now I’m curious what differences you are talking about, because I’m no Python expert, but I can’t think of any. If you mean identity representation, no, it’s not different:

            >>> a = 65535
            >>> b = 65535
            >>> a is b
            False