Назначение пустого значения или строки в Python

Я хотел бы понять, существует ли разница между назначением пустого значения и пустым выходом следующим образом:

1 > Назначение такого значения

string = ""

2 > Пустое значение, возвращаемое как результат

string = "abcd:"
str1, str2 = split(':')

Другими словами, существует ли разница в значениях 'string' в 1 > и 'str2' в 2 > ? И как бы метод увидел значение 'str2', если он передан как аргумент?

Ответы

Ответ 1

Проверка равенства с ==

>>> string = ""
>>> s = "abcd:"
>>> str1, str2 = s.split(':')
>>> str1
'abcd'
>>> str2
''
>>> str2 == string
True

Возможно, вы пытались сравнить с is. Это для проверки идентичности: a is b эквивалентно id(a) == id(b).

Или проверьте обе строки для пустоты:

>>> not str2
True
>>> not string
True
>>> 

Итак, оба пустые...

Ответ 2

Если вы проверите id(string) в case-1 и id(str2) в case2, это даст то же значение, оба строковых объекта одинаковы.

def mine(str1, str2):
    print str1, str2

см. вышеупомянутый метод, который вы можете вызвать mine(* string.split(':')), он передаст 'abcd:' как str1 = 'abcd' и str2 = ''.

Ответ 3

Другими словами, существует ли разница в значениях 'string' в 1 > и 'str2' в 2 > ?

Нет, нет разницы, обе являются пустыми строками "".

И как метод увидит значение 'str2', если он передан как аргумент?

Метод будет рассматривать его как строку длины 0, другими словами, пустую строку.

Ответ 4

>>> string1 = ""
>>> string2 = "abcd:"
>>> str1, str2 = string.split(':')
>>> str1
'abcd'
>>> str2
''
>>> string1 == str2
True

Нет. Между двумя пустыми строками нет разницы. Они будут вести себя одинаково во всех случаях.

Ответ 5

Вы можете сами убедиться.

>>> s1 = ''
>>> s2 = 'abcd:'
>>> s3, s4 = s2.split(':')
>>> s1 == s4
True

Ответ 6

>>> string = ""
>>> id(string)
2458400
>>> print string

>>> string = "abcd:"
>>> str1, str2 = string.split(':')
>>> print str1
abcd
>>> print str2

>>> id(str2)
2458400
>>> type(string)
<type 'str'>
>>> type(str2)
<type 'str'>

Нет никакой разницы

Ответ 7

Пустая строка является литералом, в литературе Python - неизменяемые объекты, и значение никогда не изменяется. Однако в некоторых случаях два литерала с одинаковым значением могут иметь разные идентификаторы (Identity объекта является адресом ячейки памяти в CPython, и вы можете получить его с помощью id (obj)), чтобы ответить на ваш вопрос

print id(string) == id(str2)  # Can output either True or False
print string == str2  # Will always output True

Обратите внимание, что большая часть времени id (string) должна быть равна id (str2):).

Подробнее о модели данных можно прочитать в Python Language Reference. Я цитирую текст, относящийся к вопросу:

Типы затрагивают почти все аспекты поведения объекта. Даже важность идентичности объекта в некотором смысле затрагивается: для неизменяемых типы, операции, которые вычисляют новые значения, могут фактически вернуть ссылку на любой существующий объект с тем же типом и значением, в то время как для изменяемых объектов это недопустимо. Например, после a = 1; b = 1, a и b может или не может ссылаться на один и тот же объект со значением один, в зависимости от реализации, но после c = []; d = [], c и d являются гарантированно ссылаться на два разных, уникальных, вновь созданных пустых списки. (Обратите внимание, что c = d = [] присваивает один и тот же объект как c, так и d.)