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]

  • marcos@lemmy.world
    link
    fedilink
    arrow-up
    1
    ·
    30 days 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
    
    • nickwitha_k (he/him)@lemmy.sdf.org
      link
      fedilink
      arrow-up
      0
      ·
      edit-2
      29 days ago

      I was meaning how they behave in when copying and similar behavior. One basically just needs to remember that assignment of a Python primitives var to another will copy the value, whereas doing the same thing with a collection will generally make a reference instead.

      As for this:

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

      I’d expect that behavior in must programming languages. It effectively translates to:

      Allocate a variable "a" and assign it the value 65535
      
      Allocate a variable "b" and assign it the value 65536
      
      Is variable "a" literally the variable "b"? No
      

      One could test with == to see if the values are equivalent but, unless “b” is assigned as “a”, a is b should evaluate as false because they are two different variables.

      • marcos@lemmy.world
        link
        fedilink
        arrow-up
        1
        ·
        29 days ago

        It doesn’t seem to copy the value, just make another reference:

        >>> a = 65535
        >>> b = a
        >>> b is a
        True
        

        One thing I know that Python does is optimize the value away for the few smallest values of the primitives. But that’s on optimizations.

        • nickwitha_k (he/him)@lemmy.sdf.org
          link
          fedilink
          arrow-up
          2
          ·
          28 days ago

          Oh right! You are indeed correct. It is effectively just seeing a pointer there. What Python considers that to be is a shallow copy. But this only applies to “primitive” types. If you change the value of either, it will cease to act as a pointer to the same object but instead allocate a new one. It’s a bit weird if one isn’t used to all of that abstraction between oneself and the memory.

          • marcos@lemmy.world
            link
            fedilink
            arrow-up
            2
            ·
            28 days ago

            As I said, it’s because you can’t change the value of a primitive value. (That is, unless you abuse the C interface.)

            Because Python doesn’t protect classes, you just can’t do the same with the types you create. But that’s what is special, not the way if handles variables.

            And this is different from languages like Java/C#, PHP/Perl, etc. Most imperative languages have primitive atomic values that go directly into your variables. But Python has only references (except for some complicated optimizations). Anyway, it is weird, and it’s one of the reasons people should learn C or Rust eventually.

      • logging_strict@programming.dev
        link
        fedilink
        arrow-up
        2
        arrow-down
        1
        ·
        27 days ago

        Other, maybe clearer, way to inspect references

        id(a) == id(b)

        Then reserve the use of is for bool or None.

        Python has a concept of, Just don't do that. Which would be a great title for this topic thread.