Имя и значение – Go vs Python

В python с кодом ниже,

x = 3 x='str' 

позволяет x сначала указывать на объект типа int а затем на объект типа str , поскольку питон динамически типизирован . type(x) дает тип значения ( 3 или str ), но не тип имени x .

Фактически, x не сохраняет значение 3 а указывает на объект типа int , значение которого равно 3


В языке GO с синтаксисом ниже,

 func main() { y := 2 fmt.Println(reflect.TypeOf(y)) // gives 'int' y = "str" // Compile time error, because GO is static typed } 

Вопрос:

Is int , тип имени y или тип значения 2 ?

Переменные Python привязаны к экземплярам классов, которые динамически назначаются им в ходе программы. Поэтому, и особенно с изменяемыми объектами, они являются просто указателями, которые содержат информацию об их местоположении данных и типе данных, на которые они указывают. Вот почему, назначив новое значение, вы создаете новый экземпляр (который является вашим основным интересом) и привязываем к нему имя переменной, поэтому тип связан со значением , а не с самой переменной.

 >>> x = 3; id(x) 1996006560 >>> x = 'str'; id(x) 1732654458784 

Переменные Go, с другой стороны, служат (когда не указатели) в качестве местоположений памяти оплотов, поскольку язык компилируется, а переменные получают постоянное «задание» для хранения определенного типа информации (что также может быть указателем). Следовательно, переменная почти наверняка сохранит свою память вдоль программы, будет иметь постоянные свойства типа данных, и вы могли бы сказать, что сама переменная имеет определенный тип (а не тип полу-указателя).

 package main import . "fmt" func main () { x := "str"; Println(&x) // 0xc04203a1c0 x = "Hello world!"; Println(&x) // 0xc04203a1c0 }