Являются ли строки обработаны ссылкой или значением в Python?

Возможно, вы не запустили свой Mysql и Apache Server. После того, как я запустил сервер Apache и Mysql из панели управления XAMPP, соединение было успешно установлено.

Удачи!

1
задан AyoubOm 13 July 2018 в 14:44
поделиться

2 ответа

Под капотом в CPython все указатель на PyObject . Подтип PyListObject имеет указатель на массив указателей на PyObjects среди его структурных полей.

Строки также являются подтипом PyObject, обычно реализованным в PyUnicodeObject . Аналогично списку, строка содержит указатель на буфер, содержащий его элементы.

Таким образом, последовательность указателей на самом деле выглядит так:

  1. Указатель на объект списка
  2. Указатель на буфер списка
  3. Указатель на строковый объект
  4. Указатель на строковые данные

Вы можете сделать вывод, что ваш список буфер не может иметь [len('aaa') + len('bbb')] * size_of_char элементов по ряду причин.

  1. Все в Python - это объект, поэтому, по крайней мере, вам нужно иметь место для дополнительных метаданных.
  2. Списки могут содержать любой объект, а не только строки фиксированной длины. Как вы индексируете в список, где элементы имеют разные размеры?
  3. Символы могут иметь разные размеры в Юникоде. Количество байтов в строке и количество символов напрямую не связаны. Это возвращает нас как к # 1, так и к # 2.

В общем, если вам интересно узнать о внутренних функциях CPython, посмотрите в API docs , и исходный код .

2
ответ дан Mad Physicist 17 August 2018 в 13:43
поделиться
  • 1
    Приятно, спасибо @Mad Physicist – Mr. J 13 July 2018 в 04:40
  • 2
    Спасибо @Mad Physicist, я просто понимаю, почему в [1, 2, 'aa'] id (= адрес) из l[2] не обязательно больше адреса l[1]. На самом деле это не адреса ячеек в буфере списка, а адреса элементов, на которые ссылаются ячейки буфера. – AyoubOm 13 July 2018 в 06:27
  • 3
    @AyoubOm. Ваше понимание кажется правильным. Вы должны выбрать ответ, нажав на галочку рядом с ним, если вы почувствуете, что на ваш вопрос был дан ответ. Это удалит его из оставшейся без очереди очереди и раздаст все точки. – Mad Physicist 13 July 2018 в 07:18

Способ доступа к адресу python - использовать id ().

>>> a=['aaa', 'bbb']

>>> id(a)
62954056

>>> id(a[0])
62748912

>>> id(a[1])
61749544

Дальше чтение здесь [понимание-python-переменные и управление памятью] .

3
ответ дан Marcus.Aurelianus 17 August 2018 в 13:43
поделиться
  • 1
    Технически деталь реализации, но хорошая аргументация – Mad Physicist 13 July 2018 в 04:03
  • 2
    @ Безумный физик, спасибо, сэр. – Marcus.Aurelianus 13 July 2018 в 04:04
Другие вопросы по тегам:

Похожие вопросы: