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
    19
    ·
    1 day 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
        ·
        1 day 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
          ·
          1 day 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
            ·
            23 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
            
  • marcos@lemmy.world
    link
    fedilink
    arrow-up
    9
    ·
    edit-2
    1 day ago

    Hum… No it won’t.

    It’s something you only really learn from C or Rust, but your operations will set both to the same list. If you go and change the list, you will change both, but if you set one to a different list, you won’t change the other list.

    In other words, if you do list1.push(4), you will change list2. But list1 = [3, 2, 1] won’t.

  • Diplomjodler@lemmy.world
    link
    fedilink
    arrow-up
    1
    ·
    edit-2
    18 hours ago

    Everything’s an object. A variable is a pointer to an object. var1 is a pointer to the object 1 (which is an integer). var2 is also a pointer to the same object. If you point var1 to a different object (the integer 2), that doesn’t change var2. list1 is a pointer to the list object you defined. list2 is a pointer to the same object. If you change the object, both pointers still point to it.

    At least that’s my understanding of the whole business. If I got anything wrong, in sure somebody will point it out.