Строка в Python - PullRequest
       0

Строка в Python

0 голосов
/ 22 января 2020

Учитывая этот пример:

string1 = 'Pythan' # String object
string1[4] = '0'

При попытке изменить значение индекса 4, это приводит к ошибке, 'str' object does not support item assignment.

Решением для этого является преобразование строки в сначала список:

list1=list(string1)
print(string1)

Вывод

['P', 'y', 't', 'h', 'a', 'n']

Теперь изменение четвертого элемента на 'o' работает:

list1[4] = 'o'  #Now this modifies the 4th element.
print(list1) 

Вопрос:

Если вы выберете какой-либо конкретный элемент списка и проверите его тип (type(list1[4])), он вернет 'str'. Почему его можно изменять, поскольку элемент является строкой, а строки неизменяемы?

Ответы [ 3 ]

1 голос
/ 22 января 2020

Список - это просто последовательность ссылок на другие Python объекты. В вашем примере тип list1 будет list,

>>> type(list1)
<class 'list'>

, поэтому list1 является изменяемым. Однако list1[4] относится к неизменяемому объекту 'a', поэтому его тип: str.

Когда вы изменяете список на list1[4]='o', вы фактически просто указываете Python изменить список, имея его четвертый элемент, ссылающийся на неизменяемый объект «о» вместо неизменяемого объекта «а», но оба они будут находиться как отдельные объекты в памяти и являются неизменяемыми.

1 голос
/ 22 января 2020

в вашем коде

для str1 = 'python', здесь str1 - строковый объект, который является неизменным.

теперь, когда вы изменяете тип объекта, скажем list1 = list(str1), здесь list1 имеет тип list ie это тип объекта list.

в str1 вы можете увидеть любой элемент в определенной позиции str1[1] = 'y', строки могут быть изменены, вы не можете изменить его, так как он определен как неизменяемый. но когда вы делаете то же самое в объекте списка, вы можете изменить его на любой объект no или class.

так что смотрите коронологию, str1 имеет тип string, где вы можете увидеть элемент в позиции, а list1 - тип списка, где вы можете изменить элемент.

строки являются неизменяемыми и итерируемый (вы можете получить доступ только к объектам только для чтения), а список может изменяться, итерируемый (может получать доступ и изменять)

1 голос
/ 22 января 2020
list1[4] = 'o'

Этот оператор создает новый строковый объект и присваивает его 5-му элементу в list1.

Для иллюстрации использования функции id() :

def print_list(input_list):
    print(input_list)
    print([id(elem) for elem in input_list])

example_list = list("Pythan")
print_list(example_list)

example_list[4] = "o"
print_list(example_list)

Вывод

$ python3 test.py
['P', 'y', 't', 'h', 'a', 'n']
[140304019637840, 140304019089704, 140304019843648, 140304019687776, 140304019613992, 140304020050696]
['P', 'y', 't', 'h', 'o', 'n']
[140304019637840, 140304019089704, 140304019843648, 140304019687776, 140304019638120, 140304020050696]

Обратите внимание, что адреса памяти для всех элементов одинаковы, за исключением элемента, который был заменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...