LINUX.ORG.RU

История изменений

Исправление soomrack, (текущая версия) :

    B = (1, 2)
    print(B is (1, 2))
    True
    C = (1, 2)
    print(B is C)
    True
    C = tuple(list(B))
    print(B is C)
    False
    print(B is (1, 2))
    print(C is (1, 2))
    print(B)
    print(C)
    True
    False
    (1, 2)
    (1, 2)
    my_set = {1, 'abc'}
    my_set.add(B)
    my_set.add(C)
    print(my_set)
    {'abc', 1, (1, 2)}
    for item in my_set:                                                                                                                                                     
        print(item is C)
    False
    False
    False

WTF?!

PS: питон засовывает в множество оперируя операцией сравнения «==», соответственно, если какой-то объект оказался равным в смысле «==» какому-то объекту уже находящемуся в множестве, то объект добавлен не будет. Это абсолютно бесчеловечно по отношению к программисту, проверять на наличие нужно по операции is и хранить в множестве сами объекты.

При этом он действительно хранит именно САМИ объекты:

    my_set = set()                                                                                 
    my_set.add(C)                                                                                  
    print(my_set)                                                                                  
    D = my_set.pop()                                                                               
    print(D is C)
    print(D is (1, 2))
    {(1,2)}
    True
    False

Исправление soomrack, :

    B = (1, 2)
    print(B is (1, 2))
    True
    C = (1, 2)
    print(B is C)
    True
    C = tuple(list(B))
    print(B is C)
    False
    print(B is (1, 2))
    print(C is (1, 2))
    print(B)
    print(C)
    True
    False
    (1, 2)
    (1, 2)
    my_set = {1, 'abc'}
    my_set.add(B)
    my_set.add(C)
    print(my_set)
    {'abc', 1, (1, 2)}
    for item in my_set:                                                                                                                                                     
        print(item is C)
    False
    False
    False

WTF?!

PS: питон засовывает в множество оперируя операцией сравнения «==», соответственно, если какой-то объект оказался равным в смысле «==» какому-то объекту уже находящемуся в множестве, то объект добавлен не будет. Это абсолютно бесчеловечно по отношению к программисту, проверять на наличие нужно по операции is и хранить в множестве сами объекты.

При этом он действительно хранит именно САМИ объекты:

    my_set = set()                                                                                 
    my_set.add(C)                                                                                  
    print(my_set)                                                                                  
    D = my_set.pop()                                                                               
    print(D is C)
    print(D is (1, 2))
    {(1,2)}
    True
    False

Исправление soomrack, :

    B = (1, 2)
    print(B is (1, 2))
    True
    C = (1, 2)
    print(B is C)
    True
    C = tuple(list(B))
    print(B is C)
    False
    print(B is (1, 2))
    print(C is (1, 2))
    print(B)
    print(C)
    True
    False
    (1, 2)
    (1, 2)
    my_set = {1, 'abc'}
    my_set.add(B)
    my_set.add(C)
    print(my_set)
    {'abc', 1, (1, 2)}
    for item in my_set:                                                                                                                                                     
        print(item is C)
    False
    False
    False

WTF?!

PS: питон засовывает в множество оперируя операцией сравнения «==», соответственно, если какой-то объект оказался равным в смысле «==» какому-то объекту уже находящемуся в множестве, то объект добавлен не будет. Это абсолютно бесчеловечно по отношению к программисту, проверять на наличие нужно по операции is и хранить в множестве сами объекты.

При этом он хранит именно объекты:

    my_set = set()                                                                                 
    my_set.add(C)                                                                                  
    print(my_set)                                                                                  
    D = my_set.pop()                                                                               
    print(D is C)
    print(D is (1, 2))
    {(1,2)}
    True
    False

Исправление soomrack, :

    B = (1, 2)
    print(B is (1, 2))
    True
    C = (1, 2)
    print(B is C)
    True
    C = tuple(list(B))
    print(B is C)
    False
    print(B is (1, 2))
    print(C is (1, 2))
    print(B)
    print(C)
    True
    False
    (1, 2)
    (1, 2)
    my_set = {1, 'abc'}
    my_set.add(B)
    my_set.add(C)
    print(my_set)
    {'abc', 1, (1, 2)}
    for item in my_set:                                                                                                                                                     
        print(item is C)
    False
    False
    False

WTF?!

Исправление soomrack, :

    B = (1, 2)
    print(B is (1, 2))
    True
    C = (1, 2)
    print(B is C)
    True
    C = tuple(list(B))
    print(B is C)
    False
    print(B is (1, 2))
    print(C is (1, 2))
    print(B)
    print(C)
    True
    False
    (1, 2)
    (1, 2)
    my_set = {1, 'abc'}
    my_set.add(B)
    my_set.add(C)
    print(my_set)
    {'abc', 1, (1, 2)}

WTF?!

Исправление soomrack, :

    B = (1, 2)
    print(B is (1, 2))
    True
    C = (1, 2)
    print(B is C)
    True
    C = tuple(list(B))
    print(B is C)
    False
    print(B is (1, 2))
    print(C is (1, 2))
    print(B)
    print(C)
    True
    False
    (1, 2)
    (1, 2)
    my_set = {1, 'abc'}
    my_set.add(B)
    my_set.add(C)
    print(my_set)
    {'abc', 1, (1, 2)}

WTF?!

PS: нетранзитивность отношения эквивалентности (is) это нечто!

Исходная версия soomrack, :

    B = (1, 2)
    print(B is (1, 2))
    True
    C = (1, 2)
    print(B is C)
    True
    C = tuple(list(B))
    print(B is C)
    False
    print(B is (1, 2))
    print(C is (1, 2))
    print(B)
    print(C)
    True
    False
    (1, 2)
    (1, 2)
    my_set = {1, 'abc'}
    my_set.add(B)
    my_set.add(C)
    print(my_set)
    {'abc', 1, (1, 2)}

WTF?!