tomelly 2022-03-25 19:18 采纳率: 100%
浏览 23
已结题

同一可变对象(如列表)赋值给不同的变量(如a、b),则变量a、b的地址是不同的,为什么会是这样?

a = [1, 2, 3]
b = [1, 2, 3]
print(id(a), id(b))
print(id([1, 2, 3]), id([1, 2, 3]))
运行结果如下:
5268040 5268104
5754440 5754440

在链式赋值的情况下:
a = b = [1, 2, 3]
print(id(a), id(b))
print(id([1, 2, 3]), id([1, 2, 3]))
运行结果如下:
6120008 6120008
6120072 6120072

  • 写回答

1条回答 默认 最新

  • 陈年椰子 2022-03-26 09:52
    关注

    首先了解python 的编译处理过程。
    一、对于一些简单类型,python做了预编译地址的处理。
    比如这样

    img


    a , b 都赋值1 时, a,b 的地址是一样的。 但如果改了值 , 地址会变化。

    二、而赋值非简单类型时,
    你给例子的前部分, a,b 的地址都不一样 , 这样看起来就正常了。

    三、用 a = b = [1,2,3]
    这种赋值,就是对象赋值了, 就是传地址,不建议这么用。因为这个就是同一对象做了不同的引用。
    这样比较合适

    img

    四、另外要注意的是, 如果列表的数据的传递,也是对象地址,要想传值,而不是传对象地址,要用拷贝功能。或者的python 里的copy

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月3日
  • 已采纳回答 3月26日
  • 创建了问题 3月25日

悬赏问题

  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥30 java 项目中同包中,无法在子文件中引用
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题
  • ¥15 使用dify通过OpenAI 的API keys添加OpenAI模型时报了“Connection Error”错误
  • ¥40 想找个软件,但我不知道怎么找到它,我甚至不知道有没有
  • ¥15 怎么把60秒的视频时长改成显示0秒?且视频内容没有任何变化的正常播放?目的是为了解决一些平台对视频时长的要求,最好有自动处理的工具!
  • ¥15 累加器设初值为00H