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]

you are viewing a single comment's thread
view the rest of the comments
[–] 20 points 1 year ago (4 children)

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).

  • source
  • hideshow 4 child comments
  • [–] 6 points 1 year ago (3 children)

    This. Collections (lists, dicts, tuples) behave a little differently than primitives.

  • source
  • parent
  • hideshow 3 child comments
  • [–] 3 points 1 year ago (2 children)

    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.

  • source
  • parent
  • hideshow 2 child comments
  • [–] 1 point 1 year ago (1 child)

    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.

  • source
  • parent
  • hideshow 1 child comment
  • [–] 1 point 1 year 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
    
  • source
  • parent