python:改变对象的类型,这样它就不会影响过去接收到它的所有对象
python: changing type of object so it dos not effects all the objects that have received it in the past
所以我有这个 python 例子:
In [1]: a=['1']
In [2]: b=a
In [3]: a[0] = int(a[0])
In [4]: type(a[0])
Out[4]: int
In [5]: type(b[0])
Out[5]: int
为什么 b[0]
是 int
而不是 str
?
我如何解决这个问题?
这不是问题,这就是 Python 的工作方式。
当您在 Python 中创建变量时,您正在创建一个 variable name
,它是对象的 reference
。
所以这里发生的事情是您正在创建一个包含字符串 '1'
的 list
对象,并使用名称 a
.
引用该对象
这一行 b = a
将创建一个新的 name
b
,它也引用对象 ['1']
。由于 list
是一个 mutable
对象 a[0] = int(a[0])
,将 in place
(string
) '1'
的 type
更改为 (int
) 1
.
因此,因为 a
和 b
引用同一个对象,所以两者都是 int
.
的类型
这是因为当您说 b=a
时,python 不会为 b
创建新列表,并复制 a
中的元素。相反,b
只是 a
的另一个名称,并且指向内存中的相同位置。无论内存地址保存我们称为 a
的内容,都与保存我们称为 b
的内容的内存地址相同。由于在给定时间只有一个实体可能占用给定内存地址,因此 a
和 b
实际上是同义词 - 就像给你的朋友起个昵称。
这可以通过 id(...)
验证:
In [46]: a=['1']
In [47]: b=a
In [48]: id(a)==id(b)
Out[48]: True
由于列表是可变的,当您更改列表的某些索引的值时,不会创建新列表。相反,该列表的相应内存地址处的实体将替换为不同的实体。
所以,回到那个关于 b=a
的类比,就像给你的朋友起个昵称:如果你朋友的名字是约翰,而你给他起的昵称是 "J"(多么缺乏想象力!我显然需要一些咖啡)。然后,如果约翰把他的头发染成蓝色,那么 J. J. 尽管约翰这样做了,但还是无法保持他的头发颜色。
同样,b
无法保留 '1'
,尽管 a
已更改。
希望这对您有所帮助
所以我有这个 python 例子:
In [1]: a=['1']
In [2]: b=a
In [3]: a[0] = int(a[0])
In [4]: type(a[0])
Out[4]: int
In [5]: type(b[0])
Out[5]: int
为什么 b[0]
是 int
而不是 str
?
我如何解决这个问题?
这不是问题,这就是 Python 的工作方式。
当您在 Python 中创建变量时,您正在创建一个 variable name
,它是对象的 reference
。
所以这里发生的事情是您正在创建一个包含字符串 '1'
的 list
对象,并使用名称 a
.
引用该对象
这一行 b = a
将创建一个新的 name
b
,它也引用对象 ['1']
。由于 list
是一个 mutable
对象 a[0] = int(a[0])
,将 in place
(string
) '1'
的 type
更改为 (int
) 1
.
因此,因为 a
和 b
引用同一个对象,所以两者都是 int
.
这是因为当您说 b=a
时,python 不会为 b
创建新列表,并复制 a
中的元素。相反,b
只是 a
的另一个名称,并且指向内存中的相同位置。无论内存地址保存我们称为 a
的内容,都与保存我们称为 b
的内容的内存地址相同。由于在给定时间只有一个实体可能占用给定内存地址,因此 a
和 b
实际上是同义词 - 就像给你的朋友起个昵称。
这可以通过 id(...)
验证:
In [46]: a=['1']
In [47]: b=a
In [48]: id(a)==id(b)
Out[48]: True
由于列表是可变的,当您更改列表的某些索引的值时,不会创建新列表。相反,该列表的相应内存地址处的实体将替换为不同的实体。
所以,回到那个关于 b=a
的类比,就像给你的朋友起个昵称:如果你朋友的名字是约翰,而你给他起的昵称是 "J"(多么缺乏想象力!我显然需要一些咖啡)。然后,如果约翰把他的头发染成蓝色,那么 J. J. 尽管约翰这样做了,但还是无法保持他的头发颜色。
同样,b
无法保留 '1'
,尽管 a
已更改。
希望这对您有所帮助