Найти - Пользователи
Полная версия: Разная работа приравнивания списка и метода ".append()" внутри функции.
Начало » Python для новичков » Разная работа приравнивания списка и метода ".append()" внутри функции.
1 2 3 4 5
Olezhka
Интересную вещь заметил!
Создаю два списка. И меняю их в теле функции. Один список меняю методом “.append()”, а второй методом приравнивания:
 a = [1]
b = [2]
def test():
    #global b
    a.append('a')
    b = [2, 'b']
    
test()
print(a, b, sep = '\n')
Вывод:
 [1, 'a']
[2]
Второй список, естественно, не меняется, поскольку я не объявил ни один из списков внутри функции как “global”. А вот методу “.append()”, похоже, отсутствие глобальности не помеха!
Olezhka
Чего-то методы строковые и списковые по-разному работают!
 a = [1]
b = 'abc'
c = 'a s d f r e'
a.append(2)
b.replace('abc', 'xyz')  
c.split()
print(a, b, c, sep = '\n')
Вывод:
 [1, 2]
abc
a s d f r e

Метод “.append()” сразу меняет исходный список, a строковым методам “.replace()” и “.split()” требуется повторное присваивание
 b = b.replace('abc', 'xyz')  
c = c.split()
py.user.next
Olezhka
А вот методу “.append()”, похоже, отсутствие глобальности не помеха!
Olezhka
Чего-то методы строковые и списковые по-разному работают!
Olezhka
Метод “.append()” сразу меняет исходный список, a строковым методам “.replace()” и “.split()” требуется повторное присваивание
Ты возьми какую-нибудь книжку по питону. Там эти великие открытия все перечислены.
Olezhka
py.user.next
Ты возьми какую-нибудь книжку по питону. Там эти великие открытия все перечислены.
Спасибо, конечно, за совет! И за тонкий намек, что я дибил полный Но… я институтов не кончал… Неученый я! Так что я… не учу и не зубрю все подряд - что мне надо и не надо, как в институтах заставляют зубрить, не учитывая, что минимум 50% из всего, человеку в голову насильно вдолбленного, ему, может, НИКОГДА в жизни и не пригодится!.. Я самоучка, друг… На 100% самоучка. Вот есть у меня конкретная идея или задача - я под эту задачу гуглю, изучаю и учу… А не так, чтобы как в школе с “Букваря” начинать… Хотя, начинал я со статьи “Пайтон для самых маленьких” где-то… Там азы преподаны были… но, видать, не в полном объеме! ))
P.S. Ну а ты-то знаешь, почему строковые и списковые методы так по-разному работают? Можешь, если не затруднит, в паре слов объяснить?
xam1816
Olezhka
Чего-то методы строковые и списковые по-разному работают!
может потому что они разные
Olezhka
Метод “.append()” сразу меняет исходный список, a строковым методам “.replace()” и “.split()” требуется повторное присваивание
только для каждого открытия не делай отдельную тему, лучше в этой одной пусть будет.
Вот здесь тебе показывали как делать такие открытия ссылка
можешь еще использовать help()
 help(str)

или

 help(list)

py.user.next
Olezhka
Ну а ты-то знаешь, почему строковые и списковые методы так по-разному работают?
Потому что каждая строка и каждый список - это объекты. Объекты являются экземплярами классов. Строка является экземпляром класса str. Список является экземпляром класса list. Соответственно, что описано в классе, то и может делать экземпляр этого класса. Класс list к классу str никакого отношения не имеет.

У этих разных классов абсолютно разное содержимое
  
>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> dir(int)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>>
И всё это содержимое ещё и по-разному работает.

  
>>> (10).real
10
>>> (10).imag
0
>>> (10).bit_length()
4
>>>

  
>>> ''.islower()
False
>>> ''.split()
[]
>>> ''.replace('', 'x')
'x'
>>>

  
>>> [].append(1)
>>> 
>>> [2].index(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 3 is not in list
>>> 
>>> [2].index(2)
0
>>>
>>> [10, 20].pop(-1)
20
>>> [10, 20].pop(0)
10
>>> [10, 20].pop(-2)
10
>>>

Так что то, что ты ищешь между ними что-то общее, является следствием того, что ты не понимаешь, как в питоне всё устроено. А не понимаешь ты, как в питоне всё устроено, потому, что не прочитал ни одной книжки про питон. Там всё это рассказывается от и до. И питон немаленький язык, так что своими экспериментами ты будешь заниматься примерно миллион лет, изучая каждую шпуньку.
Olezhka
xam1816
может потому что они разные
Ваааау! Блин! А я-то думал, что строка и список (а еще кортеж, словарь, массив, bool и множество set туда уж в одну кучу!) - это одно и то же! Спасибо, что “Америку мне открыл”, друг!
P.S. Да только вопрос-то не в том, что они разные! А вопрос гораздо более глубинный, чем ты думаешь! Вопрос в том, почему ШИБКО умные люди, разрабатывавшие базовый функционал “Пайтона” не сделали так, чтобы эти примитивные методы, меняющие строку или список, работали ОДИНАКОВО?! Чтобы не было такого разнобоя и не приходилось помнить “Так! Вот этот метод у меня сразу изменит список… А вот этот метод изменения в строке не сохраняет”
py.user.next
Olezhka
Вопрос в том, почему ШИБКО умные люди, разрабатывавшие базовый функционал “Пайтона” не сделали так, чтобы эти примитивные методы, меняющие строку или список, работали ОДИНАКОВО?!
Потому что строка и список по-разному устроены. Строку нельзя менять вообще. Список - это объект, который меняется. Кортеж - это объект, который не меняется. Множество - это объект, который меняется. Число - это объект, который не меняется. Словарь - это объект, который меняется. Строка - это объект который не меняется.

Например, при замене символа в строке строка не меняется, а создаётся новая строка, а старая строка остаётся прежней.
  
>>> s = 'abc'
>>> new = s.replace('a', 'x')
>>> id(s), id(new)
(139996073851624, 139995938031408)
>>> s
'abc'
>>> new
'xbc'
>>>
Olezhka
Чтобы не было такого разнобоя и не приходилось помнить
Мы всё помним. Вот ты откуда помнишь, что слово “приходилось” надо писать, как “приходилось”, а не как “приходилась” или как “приходились” или вообще как “приходилюсь”? Почему ты написал “приходилось помнить”, а не “приходились помнить” или “приходилась помнить”? Наверное, потому, что это будет просто неправильно по правилам языка. Так вот питон - это тоже язык и у него тоже есть правила. Если строка зафиксирована, значит так надо, значит это что-то даёт. Хочешь, чтобы она была изменяемой, ну тогда будешь ждать по полчаса, пока будут читаться файлы или там данные куда-то сохраняться, потому что он не блоками будет это читать/писать а по одному меняемому символу, который будет помнить про себя своё значение и хранить свои данные, нужные для его изменения. Потом её не хватит, она начнёт вообще вся копироваться куда-то, чтобы новые изменения в ней поместились.
Olezhka
py.user.next
Например, при замене символа в строке строка не меняется, а создаётся новая строка, а старая строка остаётся прежней.
Конечно, создается! Потому что ты сам же ее и создаешь! )) “new = ”
А методы эти… строки и списки… Мне кажется, проблема не в том, что СТРОКА не меняется как и кортеж или константа, а в том, что сами МЕТОДЫ реализованы по-разному! Метод “.replace()” возвращает измененную строку, но исходную при этом не меняет. А метод “.append()” возвращает дырку от бублика , но при этом меняет ИСХОДНЫЙ список.
 a = '123'
print(a.replace('2', 'x'))
print(a)
b = [1,2,3]
print(b.append('x'))
print(b)
Вывод:
 1x3
123
None
[1, 2, 3, 'x']
Вот из-за этого и путаница у начинающих может быть! Ведь так?
Olezhka
py.user.next
Хочешь, чтобы она была изменяемой, ну тогда будешь ждать по полчаса, пока будут читаться файлы или там данные куда-то сохраняться, потому что он не блоками будет это читать/писать а по одному меняемому символу, который будет помнить про себя своё значение и хранить свои данные, нужные для его изменения. Потом её не хватит, она начнёт вообще вся копироваться куда-то, чтобы новые изменения в ней поместились.
А вот это уже дельное разъяснение, достойное похвалы! О таких глубинных механизмах я не задумывался!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB