全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

go和python变量赋值遇到的一个问题

平时写得多的是python,最近看了一点go,今天碰到了一个问题,和大家分享一下

package main

import "fmt"

type student struct {
  Name string
  Age int
}

func pase_student() {
  m := make(map[string]*student)
  stus := []student{
    {Name: "zhou", Age: 24},
    {Name: "li", Age: 23},
    {Name: "wang", Age: 22},
  }
  for _, stu := range stus {
    m[stu.Name] = &stu
  }
  fmt.Println(m["zhou"].Name)
}

func main() {
  pase_student()
}

代码很简单,大家可以思考一下会打印出什么。

time.sleep(60)  # 思考

结果是 wang !,惊喜不惊喜!遍历赋值啊同学们,这么简单的操作都能出幺蛾子,WTF!

为什么是 wang 呢?
你tm给我
解释解释
什么是惊喜

for循环的时候,变量stu的指针是不变的,每次循环仅仅是对student结构体的 值 拷贝,上面的for循环和下面是一样的:

var stu student 
for _, stu = range stus {
 m[stu.Name] = &stu
}

所以 &stu 自始至终都是一个地址,变化的是这个地址上存储的值。 &stu 最终存储的值是 student{Name: "wang", Age: 22} 结构体,所以拿出来的是 wang 。

可以将 m 打出来看一下:

map[zhou:0xc42000a260 li:0xc42000a260 wang:0xc42000a260]

验证了我们上面的想法,大家的value都是同一个地址。

看到这里,如果是一个日常写c,c++等强类型语言的同学可能会说,神经病啊!这有什么好说的!不就是这样的吗!请原谅我,我日常写python的 [捂脸]。

从上面的例子可以看出来,在go中,变量名是 存储地址的名字 。它在编译时绑定已经完成,运行时是不可以改变的,你只能改变地址中存储的值。

而在python中,变量是对象的名字,运行时变量可以绑定到任意的对象上。如下所示:

In [4]: a = 123456

In [5]: id(a)
Out[5]: 4426596208

In [6]: a = 1234567

In [7]: id(a)
Out[7]: 4426592592

注意:由于python对int类型实现了 小整数对象池 ,不要用 0-255 的整数做实验,不然你得到id会是一样的。

也就是说,当你循环一个list的时候,每次得到的是不同对象,变量指向了不同的地址:

In [9]: for i in [2222, 2223, 2224]:
  ...:   print(id(i))
  ...:
4426596208
4426592336
4426596080

上面这段代码,python为我们创建了3个 PyIntObject , i 只是他们的名字。而在go中,可以认为只有一个object,值变化了3次。

python中说的 赋值就是建立一个对象的引用 ,是实话。


# python  # 变量赋值  # 多个变量赋值  # 全局变量赋值  # Python动态声明变量赋值代码实例  # python变量赋值方法(可变与不可变)  # Python中实现变量赋值传递时的引用和拷贝方法  # Python变量赋值的秘密分享  # Python编程之变量赋值操作实例分析  # 深入理解Python中变量赋值的问题  # python实现同时给多个变量赋值的方法  # python模块中判断全局变量的赋值的实例讲解  # 的是  # 都是  # 而在  # 绑定  # 是一个  # 他们的  # 给我  # 看了  # 是这样  # 都能  # 是一样的  # 不可以  # 遍历  # 当你  # 这段  # 得多  # 同学们  # 很简单  # 不就  # 仅仅是 


相关文章: c++怎么用jemalloc c++替换默认内存分配器【性能】  佛山企业网站制作公司有哪些,沟通100网上服务官网?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  网站制作壁纸教程视频,电脑壁纸网站?  建站之星伪静态规则如何设置?  广州美橙建站如何快速搭建多端合一网站?  建站之星后台密码如何安全设置与找回?  网站制作难吗安全吗,做一个网站需要多久时间?  如何用PHP快速搭建高效网站?分步指南  建站主机默认首页配置指南:核心功能与访问路径优化  北京网站制作公司哪家好一点,北京租房网站有哪些?  jQuery 常见小例汇总  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  定制建站如何定义?其核心优势是什么?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  如何在IIS中新建站点并配置端口与物理路径?  存储型VPS适合搭建中小型网站吗?  建站之星价格显示格式升级,你的预算足够吗?  相册网站制作软件,图片上的网址怎么复制?  如何配置IIS站点权限与局域网访问?  网站制作企业,网站的banner和导航栏是指什么?  如何选择适配移动端的WAP自助建站平台?  焦点电影公司作品,电影焦点结局是什么?  如何选择美橙互联多站合一建站方案?  建站之星如何通过成品分离优化网站效率?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  北京专业网站制作设计师招聘,北京白云观官方网站?  网站按钮制作软件,如何实现网页中按钮的自动点击?  如何用西部建站助手快速创建专业网站?  油猴 教程,油猴搜脚本为什么会网页无法显示?  建站与域名管理如何高效结合?  如何零成本快速生成个人自助网站?  如何通过可视化优化提升建站效果?  个人摄影网站制作流程,摄影爱好者都去什么网站?  建站之星如何快速解决建站难题?  如何获取PHP WAP自助建站系统源码?  网站代码制作软件有哪些,如何生成自己网站的代码?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  php json中文编码为null的解决办法  重庆市网站制作公司,重庆招聘网站哪个好?  贸易公司网站制作流程,出口贸易网站设计怎么做?  建站主机SSH密钥生成步骤及常见问题解答?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何在阿里云高效完成企业建站全流程?  nginx修改上传文件大小限制的方法  制作公司内部网站有哪些,内网如何建网站?  如何快速搭建支持数据库操作的智能建站平台?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。