Skip to content

sorted(x) modifies the argument x (bug?) #866

Closed

Description

@chopin

x.sort() modifies x, but sorted(x) doesn't modify the argument x in Python as following:

>>> l=[2,1,3]
>>> sorted(l)
[1, 2, 3]
>>> l
[2, 1, 3]

But, I encountered a Transcrypted code modifying the argument x in sorted(x):

print('cups.x= ', [c.mesh.position.x for c in cups])
cupClosest= sorted(cups, key=lambda cup: cup.mesh.position.subtract(posLocal).length())[0]
print('cups.x(after sorted())= ', [c.mesh.position.x for c in cups])

result:

cups.x=  [-0.779135848130025, -0.259711949376675, 0.259711949376675, 0.779135848130025]
cups.x(after sorted())=  [0.259711949376675, -0.259711949376675, 0.779135848130025, -0.779135848130025]

Based on the example above, it looks like sorted(x) modifies x as x.sort() in Transcrypt. It is not true in Python.

Activity

  1. changed the title [-]sorted(x) changes the argument x (bug?)[/-] [+]sorted(x) modifies the argument x (bug?)[/+] on Dec 18, 2023
  2. Iv3li0s commented on May 3, 2024

    @Iv3li0s

    The sorted() method call the copy() method
    And the copy() method contains :

    export function copy (anObject) {
        if (anObject == null || typeof anObject == "object") {
            return anObject;
        } else {
            var result = {};
            for (var attrib in obj) {
                if (anObject.hasOwnProperty (attrib)) {
                    result [attrib] = anObject [attrib];
                }
            }
            return result;
        }
    }
    

    It's bugged
    If it's an object (an array in your case) it return the object. So useless for a copy method.
    Otherwise an error occur because "obj" is not know in the loop

    The copy method must be something like :

    export function copy (anObject) {
        if (anObject == null || typeof anObject != "object") {
            return anObject;
        }
        else {
            if (anObject instanceof Array){
              var res = []
              for(var elem of anObject){
                res.push(elem)
              }
              return res
            }else{
              var result = {};
              for (var attrib in anObject) {
                if (anObject.hasOwnProperty (attrib)) {
                  result [attrib] = anObject [attrib];
                }
              }
              return result;
            }
        }
    }
    
  3. self-assigned this
    on Jul 5, 2024
  4. JennaSys commented on Jul 6, 2024

    @JennaSys
    Collaborator

    The copy function that sorted is using has been re-implemented as part of the new copy module in dev_3.9.3 branch to be released in v3.9.3
    It should work in most cases, but needs a bit more testing.

  5. JennaSys commented on Jul 17, 2024

    @JennaSys
    Collaborator

    Merged to master on PR #876

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions