Разве строки Python не являются неизменяемыми?Тогда почему + "" + b работает? - PullRequest
89 голосов
/ 01 февраля 2012

Насколько я понимаю, строки Python неизменны.

Я попробовал следующий код:

a = "Dog"
b = "eats"
c = "treats"

print a, b, c
# Dog eats treats

print a + " " + b + " " + c
# Dog eats treats

print a
# Dog

a = a + " " + b + " " + c
print a
# Dog eats treats
# !!!

Разве Python не должен был помешать назначению? Я, наверное, что-то упустил.

Есть идеи?

Ответы [ 19 ]

2 голосов
/ 06 апреля 2018

Строковые объекты Python являются неизменяемыми. Пример:

>>> a = 'tanim'
>>> 'Address of a is:{}'.format(id(a))
'Address of a is:64281536'
>>> a = 'ahmed'
>>> 'Address of a is:{}'.format(id(a))
'Address of a is:64281600'

В этом примере мы можем видеть, что когда мы назначаем другое значение в a, оно не изменяется. Новый объект создается.
И это не может быть изменено. Пример:

  >>> a[0] = 'c'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    **TypeError**: 'str' object does not support item assignment

Произошла ошибка.

2 голосов
/ 17 февраля 2017

Переменные могут указывать куда угодно. Ошибка будет вызвана, если вы сделаете следующее:

a = "dog"
print a                   #dog
a[1] = "g"                #ERROR!!!!!! STRINGS ARE IMMUTABLE
1 голос
/ 14 июля 2018

'mutable' означает, что мы можем изменить содержимое строки, «неизменяемый» означает, что мы не можем добавить дополнительную строку.

click for photo proof

1 голос
/ 14 марта 2018

Добавление немного больше к вышеупомянутым ответам.

id переменной изменяется при переназначении.

>>> a = 'initial_string'
>>> id(a)
139982120425648
>>> a = 'new_string'
>>> id(a)
139982120425776

Это означает, что мы изменили переменную a, чтобы она указала на новую строку. Сейчас существует два string (str) объектов:

'initial_string' с id = 139982120425648

и

'new_string' с id = 139982120425776

Рассмотрим следующий код:

>>> b = 'intitial_string'
>>> id(b)
139982120425648

Теперь b указывает на 'initial_string' и имеет те же id, что и a до переназначения.

Таким образом, 'intial_string' не был мутирован.

1 голос
/ 23 апреля 2017

Рассмотрим это дополнение к вашему примеру

 a = "Dog"
 b = "eats"
 c = "treats"
 print (a,b,c)
 #Dog eats treats
 d = a + " " + b + " " + c
 print (a)
 #Dog
 print (d)
 #Dog eats treats

Одно из более точных объяснений, которое я нашел в блоге:

В Python (почти) все является объектом. То, что мы обычно называем «переменными» в Python, более правильно называется именами. Аналогично, «назначение» - это действительно привязка имени к объекту. Каждая привязка имеет область видимости, которая определяет ее видимость, обычно это блок, в котором происходит имя.

Например:

some_guy = 'Fred'
# ...
some_guy = 'George'

Когда мы позже скажем some_guy = 'George', строковый объект, содержащий 'Fred', не затронут. Мы только что изменили привязку имени some_guy. Однако мы не изменили ни строковые объекты 'Fred', ни 'George'. Насколько нам известно, они могут жить бесконечно долго.

Ссылка на блог: https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/

1 голос
/ 24 декабря 2015

>>> a = 'dogs'

>>> a.replace('dogs', 'dogs eat treats')

'dogs eat treats'

>>> print a

'dogs'

Неизменный,не так ли?!

Часть изменения переменной уже обсуждалась.

0 голосов
/ 12 февраля 2019

Это изображение дает ответ. Пожалуйста, прочитайте это.

enter image description here

0 голосов
/ 07 июля 2017

Вы можете сделать неизменным массив numpy и использовать первый элемент:

numpyarrayname[0] = "write once"

тогда:

numpyarrayname.setflags(write=False)

или

numpyarrayname.flags.writeable = False
0 голосов
/ 17 октября 2014

Подведение итогов:

a = 3
b = a
a = 3+2
print b
# 5

Не является неизменным:

a = 'OOP'
b = a
a = 'p'+a
print b
# OOP

Неизменное:

a = [1,2,3]
b = range(len(a))
for i in range(len(a)):
    b[i] = a[i]+1

Это ошибка в Python 3, потому что она неизменна. И не ошибка в Python 2, потому что он явно не является неизменным.

...