有人可以解释一下:
fruits = ["banana", "orange", "grape"]
slice = fruits
print fruits==(slice.sort())
print fruits==slice
输出:
False
True
为什么第一个False
?
答案 0 :(得分:1)
sort()
对列表进行排序并返回None
。在第一次比较中,fruits
不是None
,因此会返回False
。在第二次比较中,由于fruits
和slice
指向同一个对象,因此必须返回True
。
答案 1 :(得分:0)
虽然@Mureinik已经声明就地排序函数返回None
并且一切都很好,但真正的问题是:当fruits == slice
应该是未排序的时候fruits
为什么是真的slice
1}}是唯一排序的吗?
这可能是很多信息,但请耐心等待......
slice = fruits
不会导致创建新列表,只会导致新引用排序slice
后,fruits
不应等于slice
,但事实证明确实如此。这是为什么?这是因为 slice
和fruit
引用了同一个对象。当您将slice
分配给fruit
时,您只与其建立了连接,并且其中任何一个都发生了任何变化。
在Python中,您可以检查变量是否使用is
运算符引用同一对象。请注意,这与==
不同,>>> fruits = ["banana", "orange", "grape"]
>>> slice = fruits
>>> fruits is slice
True
>>> fruits == slice
False
仅检查内容是否相同,而不是内存位置:
list(...)
以这种方式思考它。无论您使用何种操作系统,都可以创建文件的桌面快捷方式。但它只是链接到真实文件。但就像你可以复制和粘贴东西来创建独立于原始文件的独立文件一样,你也可以在Python中做到这一点。我知道有两种方法可以做到。
使用>>> fruits = ["banana", "orange", "grape"]
>>> slice = list(fruits) # constructs a new list and copies content
>>> fruits is slice
False
>>> slice is fruits
False
>>> fruits == slice
True
copy.copy(...)
使用>>> from copy import copy
>>> fruits = ["banana", "orange", "grape"]
>>> slice = copy(fruits) # copies to new list
>>> fruits is slice
False
>>> slice is fruits
False
>>> fruits == slice
True
None
list.sort()
)回到问题所在:使用None
完成的就地排序意味着没有创建新对象并且您修改了原始对象。这就是为什么函数不返回任何东西 - 它不需要因为它改变了原始内容。它只返回fruits
,正如@Mureinik所说,None
在任何时候都不是>>> fruits = ['banana', 'orange', 'grape']
>>> fruits = fruits.sort()
>>> fruits # not going to print anything
>>> fruits is None
True
>>> fruits == None
True
。
快速演示:
slice
现在,当您通过修改fruits
的内容进行就地排序时,您还修改了sorted()
的内容,因为它们同时引用了对象。只有一个对象被创建和操作。
>>> fruits = ["banana", "orange", "grape"]
>>> slice = fruits
>>> slice # still referring to same object
["banana", "orange", "grape"]
>>> slice = sorted(slice) # creates a new list, and sorts it
>>> slice # it's not None because the above returns a new object
["banana", "grape", "orange"]
>>> fruits # not modified at all
["banana", "orange", "grape"]
>>> fruits == slice
False
>>> fruits.sort()
>>> fruits
["banana", "grape", "orange"]
>>> fruits is slice
False
>>> fruits == slice
True
是的,您可以通过创建新列表对列表进行排序。
>>> fruits = ['banana', 'orange', 'grape']
>>> slice = list(fruits) # don't refer to same object
>>> slice.sort()
>>> slice
["banana", "grape", "orange"]
>>> fruits
['banana', 'orange', 'grape']
或者,您也可以先创建一个新列表,然后进行就地排序:
public class Example {
static String getUnits() {
return
"@" //character expected to be removed in substring()
+"97ec2452-4460-4796-a3a4-38fba1ab8ffc"
+","
+"56e12fc4-97b3-44e7-b59a-5df0267424ac"
+","
+"e95cdfcb-14d6-4065-a69d-8f0213e1f8b4"
+"@"; //character expected to be removed in substring()
}
static String getUnitName(String id) {
switch(id) {
case "97ec2452-4460-4796-a3a4-38fba1ab8ffc" :return "unit-one";
case "56e12fc4-97b3-44e7-b59a-5df0267424ac" :return "unit-two";
default: return "unit-three";
}
}
public static void main(String[] args) {
String units = getUnits();
String units2 = units.substring(1, units.length()-1); // remove bad characters from getUnits string
String [] units3 = units2.split(",");
String [] convertedArray = new String[units3.length];
for (int i = 0; i < units3.length; i++) {
convertedArray[i] = getUnitName(units3[i]);
}
for(String name: convertedArray) {
System.out.println(name);
}
}
}