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.
因此,因为 ab 引用同一个对象,所以两者都是 int.

的类型

这是因为当您说 b=a 时,python 不会为 b 创建新列表,并复制 a 中的元素。相反,b 只是 a 的另一个名称,并且指向内存中的相同位置。无论内存地址保存我们称为 a 的内容,都与保存我们称为 b 的内容的内存地址相同。由于在给定时间只有一个实体可能占用给定内存地址,因此 ab 实际上是同义词 - 就像给你的朋友起个昵称。

这可以通过 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 已更改。

希望这对您有所帮助