前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >一个列表赋值的坑,让我懂了Python的对象机制

一个列表赋值的坑,让我懂了Python的对象机制

作者头像
用户11414625
发布2024-12-20 16:50:57
发布2024-12-20 16:50:57
4900
代码可运行
举报
文章被收录于专栏:生信星球520生信星球520
运行总次数:0
代码可运行

一个诡异的现象揭秘背后的原理Python对象的分两类1. 可变对象(Mutable)2. 不可变对象(Immutable)3.关键区别如何创建真正的副本?1. 浅拷贝(shallow copy)2. 深拷贝(deep copy)

一个诡异的现象

让我们先看一段代码:

代码语言:javascript
代码运行次数:0
复制
x = ['a','b','c']
y = x
y[1] = 'z' 

print(y)  
# ['a', 'z', 'c']
print(x) 
# ['a', 'z', 'c']

纳尼?我们只修改了变量 y,为什么 x 的值也跟着改变了呢?🤔

揭秘背后的原理

这是因为 Python 中的赋值操作 y = x 创建的是引用,而不是复制。简单来说:

  • x 和 y 指向内存中的同一个列表对象
  • 修改其中任何一个,都会影响到另一个!

Python对象的分两类

1. 可变对象(Mutable)
  • 列表(list)
  • 字典(dict)
  • 集合(set)
  • 数据框(DataFrame)
  • 矩阵(array)
  • 系列(series)
  • 对象(object)
2. 不可变对象(Immutable)
  • 数值(int, float)
  • 字符串(str)
  • 元组(tuple)
  • 布尔值(bool)

让我们用实例来说明:

代码语言:javascript
代码运行次数:0
复制
# 可变对象示例
x = ['a', 'b']
y = x
y.append('c') #修改了y,加上一个元素c
print(y)
#['a', 'b', 'c']
print(x)  # x变了
#['a', 'b', 'c']

# 不可变对象示例
x = "hello"
y = x
y = "world" #修改了y,改为"world"
print(y)
#world
print(x)  # x没变
#hello
3.关键区别

可变对象:

  • 赋值时传递引用
  • 修改会影响所有引用该对象的变量

不可变对象:

  • 看似赋值传递引用
  • 但修改时会创建新对象
  • 不会影响原对象

特殊情况 - 元组包含可变对象:

代码语言:javascript
代码运行次数:0
复制
x = ([1, 2], 3)
y = x
y[0].append(4)
print(x)  # ([1, 2, 4], 3)
# 虽然元组不可变,但其中的列表是可变的
代码语言:javascript
代码运行次数:0
复制
([1, 2, 4], 3)

如何创建真正的副本?

如果你想要一个完全独立的副本,有两种方法:

1. 浅拷贝(shallow copy)
代码语言:javascript
代码运行次数:0
复制
x = ['a','b','c']
y = x.copy()  # 或使用 list(x)
2. 深拷贝(deep copy)
代码语言:javascript
代码运行次数:0
复制
import copy
x = [[1, 2], [3, 4]]
y = copy.deepcopy(x)

💡 提示:处理嵌套数据结构时,建议使用深拷贝,它能确保创建完全独立的副本。

你有遇到过类似的困惑吗?欢迎在评论区分享你的经验~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信星球 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一个诡异的现象
  • 揭秘背后的原理
  • Python对象的分两类
    • 1. 可变对象(Mutable)
    • 2. 不可变对象(Immutable)
    • 3.关键区别
  • 如何创建真正的副本?
    • 1. 浅拷贝(shallow copy)
    • 2. 深拷贝(deep copy)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档