sorted(x) modifies the argument x (bug?)
chopin opened this issue · 3 comments
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.
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;
}
}
}
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.