【python】可变变量与不可变变量

不可变类型(如整数和字符串)

当您创建一个不可变对象(如整数、字符串)时,Python实际上是将这个值存储在内存中的某个位置,并将变量名指向这个值。例如:

lens = 10
count = lens

在这种情况下,lens 和 count 都指向内存中的同一个值 10。但是,不可变类型的关键特点是它们的值不能被改变。当您执行 count += 1 时,Python会创建一个新的整数对象 11 并更新 count 指向这个新对象。lens 仍然指向原来的整数对象 10。这就是为什么更改 count 的值不会影响 lens。
常见的不可变类型包括:

  • 整数(Integers)
  • 浮点数(Floats)
  • 字符串(Strings)
  • 元组(Tuples)
  • 布尔值(Booleans)
  • 冻结集合(Frozen sets)
    例如,当你修改一个字符串或元组时,Python实际上会创建一个新的字符串或元组对象。

可变类型(如列表)

对于可变类型(如列表),情况有所不同。当您创建一个列表并将其赋值给另一个变量时,两个变量实际上指向的是同一个列表对象。例如:

python
Copy code
lens = counts = [1, 2]

在这个例子中,lens 和 counts 实际上是指向同一个列表对象 [1, 2] 的引用。当您修改这个列表(例如 lens[0] = 0),更改会反映在这个列表对象上,因此 counts 也会看到这个更改,因为它们指向的是同一个对象。
常见的可变类型包括:

  • 列表(Lists)
  • 字典(Dictionaries)
  • 集合(Sets)

结论

不可变对象(如整数、字符串)的变量名可以被认为是指向其值的引用。赋值操作创建了新的引用,但不可变对象本身不会被改变。
可变对象(如列表)的变量名是指向对象的引用。多个变量可以指向同一个可变对象,因此一个变量对对象的修改可以通过其他指向同一对象的变量看到

举例理解

  1. 假设我有一个excel表格里面存放了数据,我用python把它的每一行读取当工作区并赋值给一个列表data,这是不是可以理解为有一块固定的内存被用来存放真正的数据,然后我新增了一个指针名叫data用来给这块内存取名字方便我们引用它。如果我用train_data复制了data,那也只是复制了如何对这块内存引用。

ChatGPT
您对 Python 面向对象编程的理解已经非常接近了。让我通过您的例子来帮助您进一步加深理解:

读取 Excel 数据:当您使用 Python(比如使用 pandas 库)读取一个 Excel 表格,并将每一行数据存储到一个列表 data 中时,发生了以下几件事情:

  • 每一行数据变成了 Python 中的一个对象(例如,如果使用 pandas,每行可能是一个 Series 对象)。
  • 这些对象被存储在内存中的某个位置。 列表 data 被创建来存放这些对象的引用,即 data 包含了指向这些行对象的指针。
  • 列表作为引用的集合:这里,data本身是一个列表对象,它在内存中占据一个位置,而列表中的每个元素是指向行对象的引用。这些引用指向实际存储数据的内存位置。

复制列表:当您创建一个新列表 train_data 并通过 train_data = datatrain_data = [entry for entry in data] 复制 data 时,您实际上是在复制引用,而不是数据本身。这意味着:

train_data 也成为一个列表对象,它自己在内存中有独立的位置。
train_data 中的每个元素是指向原始数据行对象的引用。这些引用和 data 中的引用指向同一个内存位置(即同一个数据行对象)。
内存占用:这种复制方式意味着您并没有复制数据本身(即没有创建数据的新副本),而只是复制了引用。因此,虽然 train_data 增加了一些内存占用(用于存储引用),但这远小于复制整个数据集所需的内存。

引用和对象:重要的是要区分“对象”和“引用”。对象是数据本身,存储在内存中;引用是指向这些对象的指针。在 Python 中,变量(如列表中的元素)实际上是引用。

总结一下,您理解的“有一块固定的内存被用来存放真正的数据,然后我新增了一个指针名叫 data 用来给这块内存取名字方便我们引用它”是正确的。当您复制 data 到 train_data,您复制的是对数据的引用,而不是数据本身。这种理解是 Python 面向对象编程中理解变量和数据存储方式的关键。

  1. 我想问一下,“在 Python 中,变量(如列表中的元素)实际上是引用。”。那你刚刚说data是一个列表对象,不是一个引用。data不是python中的变量吗

您提出了一个很好的问题,它涉及到 Python 中变量、对象以及引用之间的关系。让我来解释这些概念:

  • 变量:在 Python 中,变量可以被理解为名称,或者标签,它们“指向”内存中的对象。变量本身不存储数据,它们只是数据的引用。
  • 对象:对象是存储在内存中的实体,它可以是数据(如数字、字符串、列表等)或者更复杂的结构(如类的实例)。每个对象都有一个唯一的内存地址。
  • 引用:当我们说变量是引用时,我们的意思是变量指向或“引用”了内存中的一个对象。引用是变量与对象之间的链接。

当我提到 data 是一个列表对象时,我是这样表述的:

  • data 作为一个变量,它引用了一个列表对象。这个列表对象是存储在内存中的实体,它包含了元素(这些元素本身也是引用,指向其他对象)。
  • data 本身作为一个变量,它的角色是作为对这个列表对象的引用。也就是说,data 是列表对象在内存中位置的一个“标签”或“名称”。

所以,当我们说 data 是一个列表对象时,我们的意思是 data 变量指向(引用)了一个列表对象。这是 Python 变量和对象之间的典型关系:变量是对对象的引用。

这种区分有时会让人感到困惑,因为在日常使用中,我们通常不会区分变量和它所引用的对象。但在深入理解编程和内存管理时,这种区分变成了非常重要的概念。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值