Создаю два списка. И меняю их в теле функции. Один список меняю методом “.append()”, а второй методом приравнивания:
a = [1] b = [2] def test(): #global b a.append('a') b = [2, 'b'] test() print(a, b, sep = '\n')
[1, 'a'] [2]
a = [1] b = [2] def test(): #global b a.append('a') b = [2, 'b'] test() print(a, b, sep = '\n')
[1, 'a'] [2]
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
b = b.replace('abc', 'xyz') c = c.split()
Olezhka
А вот методу “.append()”, похоже, отсутствие глобальности не помеха!
Olezhka
Чего-то методы строковые и списковые по-разному работают!
OlezhkaТы возьми какую-нибудь книжку по питону. Там эти великие открытия все перечислены.
Метод “.append()” сразу меняет исходный список, a строковым методам “.replace()” и “.split()” требуется повторное присваивание
py.user.nextСпасибо, конечно, за совет! И за тонкий намек, что я дибил полный Но… я институтов не кончал… Неученый я! Так что я… не учу и не зубрю все подряд - что мне надо и не надо, как в институтах заставляют зубрить, не учитывая, что минимум 50% из всего, человеку в голову насильно вдолбленного, ему, может, НИКОГДА в жизни и не пригодится!.. Я самоучка, друг… На 100% самоучка. Вот есть у меня конкретная идея или задача - я под эту задачу гуглю, изучаю и учу… А не так, чтобы как в школе с “Букваря” начинать… Хотя, начинал я со статьи “Пайтон для самых маленьких” где-то… Там азы преподаны были… но, видать, не в полном объеме! ))
Ты возьми какую-нибудь книжку по питону. Там эти великие открытия все перечислены.
Olezhkaможет потому что они разные
Чего-то методы строковые и списковые по-разному работают!
Olezhkaтолько для каждого открытия не делай отдельную тему, лучше в этой одной пусть будет.
Метод “.append()” сразу меняет исходный список, a строковым методам “.replace()” и “.split()” требуется повторное присваивание
help(str)
help(list)
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 >>>
xam1816Ваааау! Блин! А я-то думал, что строка и список (а еще кортеж, словарь, массив, bool и множество set туда уж в одну кучу!) - это одно и то же! Спасибо, что “Америку мне открыл”, друг!
может потому что они разные
OlezhkaПотому что строка и список по-разному устроены. Строку нельзя менять вообще. Список - это объект, который меняется. Кортеж - это объект, который не меняется. Множество - это объект, который меняется. Число - это объект, который не меняется. Словарь - это объект, который меняется. Строка - это объект который не меняется.
Вопрос в том, почему ШИБКО умные люди, разрабатывавшие базовый функционал “Пайтона” не сделали так, чтобы эти примитивные методы, меняющие строку или список, работали ОДИНАКОВО?!
>>> s = 'abc' >>> new = s.replace('a', 'x') >>> id(s), id(new) (139996073851624, 139995938031408) >>> s 'abc' >>> new 'xbc' >>>
OlezhkaМы всё помним. Вот ты откуда помнишь, что слово “приходилось” надо писать, как “приходилось”, а не как “приходилась” или как “приходились” или вообще как “приходилюсь”? Почему ты написал “приходилось помнить”, а не “приходились помнить” или “приходилась помнить”? Наверное, потому, что это будет просто неправильно по правилам языка. Так вот питон - это тоже язык и у него тоже есть правила. Если строка зафиксирована, значит так надо, значит это что-то даёт. Хочешь, чтобы она была изменяемой, ну тогда будешь ждать по полчаса, пока будут читаться файлы или там данные куда-то сохраняться, потому что он не блоками будет это читать/писать а по одному меняемому символу, который будет помнить про себя своё значение и хранить свои данные, нужные для его изменения. Потом её не хватит, она начнёт вообще вся копироваться куда-то, чтобы новые изменения в ней поместились.
Чтобы не было такого разнобоя и не приходилось помнить
py.user.nextКонечно, создается! Потому что ты сам же ее и создаешь! )) “new = ”
Например, при замене символа в строке строка не меняется, а создаётся новая строка, а старая строка остаётся прежней.
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']
py.user.nextА вот это уже дельное разъяснение, достойное похвалы! О таких глубинных механизмах я не задумывался!
Хочешь, чтобы она была изменяемой, ну тогда будешь ждать по полчаса, пока будут читаться файлы или там данные куда-то сохраняться, потому что он не блоками будет это читать/писать а по одному меняемому символу, который будет помнить про себя своё значение и хранить свои данные, нужные для его изменения. Потом её не хватит, она начнёт вообще вся копироваться куда-то, чтобы новые изменения в ней поместились.