以相等

时间:2016-02-27 09:40:30

标签: python list python-2.7

有人可以解释一下:

fruits = ["banana", "orange", "grape"]
slice = fruits
print fruits==(slice.sort())
print fruits==slice

输出:

False
True

为什么第一个False

2 个答案:

答案 0 :(得分:1)

sort()对列表进行排序并返回None。在第一次比较中,fruits不是None,因此会返回False。在第二次比较中,由于fruitsslice指向同一个对象,因此必须返回True

答案 1 :(得分:0)

虽然@Mureinik已经声明就地排序函数返回None并且一切都很好,但真正的问题是:当fruits == slice应该是未排序的时候fruits为什么是真的slice 1}}是唯一排序的吗?

这可能是很多信息,但请耐心等待......

slice = fruits不会导致创建新列表,只会导致新引用

排序slice后,fruits不应等于slice,但事实证明确实如此。这是为什么?这是因为 slicefruit引用了同一个对象。当您将slice分配给fruit时,您只与其建立了连接,并且其中任何一个都发生了任何变化。

在Python中,您可以检查变量是否使用is运算符引用同一对象。请注意,这与==不同,>>> fruits = ["banana", "orange", "grape"] >>> slice = fruits >>> fruits is slice True >>> fruits == slice False 仅检查内容是否相同,而不是内存位置:

list(...)

以这种方式思考它。无论您使用何种操作系统,都可以创建文件的桌面快捷方式。但它只是链接到真实文件。但就像你可以复制和粘贴东西来创建独立于原始文件的独立文件一样,你也可以在Python中做到这一点。我知道有两种方法可以做到。

  1. 使用>>> 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(...)
  2. 使用>>> 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
  3. 就地操作修改了传递的对象,并且不返回任何内容(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);
            }
        }
    }